Initial commit: Sale packages

This commit is contained in:
Ernad Husremovic 2025-08-29 15:20:49 +02:00
commit 14e3d26998
6469 changed files with 2479670 additions and 0 deletions

View file

@ -0,0 +1,76 @@
odoo.define('website_event_sale.tour.WebsiteEventSaleTourMethods', function (require) {
'use strict';
function changePricelist(pricelistName) {
return [
{
content: "Go to page Shop",
trigger: '.nav-link:contains("Shop")',
},
{
content: "Toggle Pricelist",
trigger: '.o_pricelist_dropdown > .dropdown-toggle',
run: 'click',
},
{
content: `Activate Pricelist ${pricelistName}`,
trigger: `.dropdown-item:contains(${pricelistName})`,
run: 'click',
},
{
content: 'Wait for pricelist to load',
trigger: `.dropdown-toggle:contains(${pricelistName})`,
run: function () {},
},
];
}
function checkPriceEvent(eventName, price) {
return [
{
content: "Go to page Event",
trigger: '.nav-link:contains("Event")',
},
{
content: "Open the Pycon event",
trigger: `.o_wevent_events_list a:contains(${eventName})`,
},
{
content: "Verify Price",
trigger: `.oe_currency_value:contains(${price})`,
run: function () {}, // it's a check
},
]
}
function checkPriceDiscountEvent(eventName, price, discount) {
return [
...checkPriceEvent(eventName, price),
{
content: "Verify Price before discount",
trigger: `del:contains(${discount})`,
run: function () {}, // it's a check
},
]
}
function checkPriceCart(price) {
return [
{
content: "Go to page Cart",
trigger: '.fa-shopping-cart',
},
{
content: "Verify Price",
trigger: `[id=order_total] .oe_currency_value:contains(${price})`,
run: function () {}, // it's a check
},
]
}
const getPriceListChecksSteps = function ({pricelistName, eventName, price, priceBeforeDiscount=false}) {
const checkPriceSteps = priceBeforeDiscount ? checkPriceDiscountEvent(eventName, price, priceBeforeDiscount) : checkPriceEvent(eventName, price);
return [
...changePricelist(pricelistName),
...checkPriceSteps,
...checkPriceCart(price),
]
}
return { getPriceListChecksSteps, changePricelist, checkPriceCart }
});

View file

@ -0,0 +1,89 @@
odoo.define('website_event_sale.tour', function (require) {
'use strict';
var tour = require('web_tour.tour');
tour.register('event_buy_tickets', {
test: true,
url: '/event',
},
[
{
content: "Go to the `Events` page",
trigger: 'a[href*="/event"]:contains("Conference for Architects TEST"):first',
},
{
content: "Select 1 unit of `Standard` ticket type",
extra_trigger: '#wrap:not(:has(a[href*="/event"]:contains("Conference for Architects")))',
trigger: 'select:eq(0)',
run: 'text 1',
},
{
content: "Select 2 units of `VIP` ticket type",
extra_trigger: 'select:eq(0):has(option:contains(1):propSelected)',
trigger: 'select:eq(1)',
run: 'text 2',
},
{
content: "Click on `Order Now` button",
extra_trigger: 'select:eq(1):has(option:contains(2):propSelected)',
trigger: '.btn-primary:contains("Register")',
},
{
content: "Fill attendees details",
trigger: 'form[id="attendee_registration"] .btn:contains("Continue")',
run: function () {
$("input[name='1-name']").val("Att1");
$("input[name='1-phone']").val("111 111");
$("input[name='1-email']").val("att1@example.com");
$("input[name='2-name']").val("Att2");
$("input[name='2-phone']").val("222 222");
$("input[name='2-email']").val("att2@example.com");
$("input[name='3-name']").val("Att3");
$("input[name='3-phone']").val("333 333");
$("input[name='3-email']").val("att3@example.com");
},
},
{
content: "Validate attendees details",
extra_trigger: "input[name='1-name'], input[name='2-name'], input[name='3-name']",
trigger: 'button:contains("Continue")',
},
{
content: "Check that the cart contains exactly 3 triggers",
trigger: 'a:has(.my_cart_quantity:containsExact(3)),.o_extra_menu_items .fa-plus',
run: function () {}, // it's a check
},
{
content: "go to cart",
trigger: 'a:contains(Return to Cart)',
},
{
content: "Now click on `Process Checkout`",
extra_trigger: 'a:has(.my_cart_quantity):contains(3),#cart_products input.js_quantity[value="3"]',
trigger: '.btn-primary:contains("Process Checkout")'
},
{
content: "Check that the subtotal is 4,000.00 USD", // this test will fail if the currency of the main company is not USD
trigger: '#order_total_untaxed .oe_currency_value:contains("4,000.00")',
run: function () {}, // it's a check
},
{
content: "Select `Wire Transfer` payment method",
trigger: '#payment_method label:contains("Wire Transfer")',
},
{
content: "Pay",
//Either there are multiple payment methods, and one is checked, either there is only one, and therefore there are no radio inputs
// extra_trigger: '#payment_method input:checked,#payment_method:not(:has("input:radio:visible"))',
trigger: 'button[name="o_payment_submit_button"]:visible:not(:disabled)',
},
{
content: "Last step",
trigger: '.oe_website_sale_tx_status:contains("Please use the following transfer details")',
timeout: 30000,
}
]
);
});

View file

@ -0,0 +1,92 @@
odoo.define('website_event_sale.tour.last_ticket', function (require) {
'use strict';
var tour = require('web_tour.tour');
tour.register('event_buy_last_ticket', {
test: true,
url: '/event',
},[{
content: "Open the Last ticket test event page",
trigger: '.o_wevent_events_list a:contains("Last ticket test")',
},
{
content: "Show available Tickets",
trigger: '.btn-primary:contains("Register")',
},
{
content: "Select 2 units of `VIP` ticket type",
extra_trigger: '#wrap:not(:has(a[href*="/event"]:contains("Last ticket test")))',
trigger: 'select:eq(0)',
run: 'text 2',
},
{
content: "Click on `Order Now` button",
extra_trigger: 'select:eq(0):has(option:contains(2):propSelected)',
trigger: '.a-submit:contains("Register")',
},
{
content: "Fill attendees details",
trigger: 'form[id="attendee_registration"] .btn:contains("Continue")',
run: function () {
$("input[name='1-name']").val("Att1");
$("input[name='1-phone']").val("111 111");
$("input[name='1-email']").val("att1@example.com");
$("input[name='2-name']").val("Att2");
$("input[name='2-phone']").val("222 222");
$("input[name='2-email']").val("att2@example.com");
},
},
{
content: "Validate attendees details",
extra_trigger: "input[name='1-name'], input[name='2-name']",
trigger: 'button:contains("Continue")',
},
{
content: "Fill address",
trigger: 'form.checkout_autoformat',
run: function () {
$("input[name='name']").val("test1");
$("input[name='email']").val("test@example.com");
$("input[name='phone']").val("111 111");
$("input[name='street']").val("street test 1");
$("input[name='city']").val("testCity");
$("input[name='zip']").val("123");
$('#country_id option:eq(1)').attr('selected', true);
},
},
{
content: "Validate address",
trigger: '.btn-primary:contains("Next")',
},
{
// if the seats_available checking logic is not correct,
// the shopping cart will be cleared when selling the last ticket
// the tour test will be failed here
content: "Select `Wire Transfer` payment method",
trigger: '#payment_method label:contains("Wire Transfer")',
},
// following steps are based on the website_sale_buy.js
{
content: "Pay",
//Either there are multiple payment methods, and one is checked, either there is only one, and therefore there are no radio inputs
extra_trigger: '#payment_method label:contains("Wire Transfer") input:checked,#payment_method:not(:has("input:radio:visible"))',
trigger: 'button[name="o_payment_submit_button"]:visible:not(:disabled)',
},
{
content: "payment finish",
trigger: '.oe_website_sale:contains("Please use the following transfer details")',
// Leave /shop/confirmation to prevent RPC loop to /shop/payment/get_status.
// The RPC could be handled in python while the tour is killed (and the session), leading to crashes
run: function () {
window.location.href = '/contactus'; // Redirect in JS to avoid the RPC loop (20x1sec)
},
timeout: 30000,
},
{
content: "wait page loaded",
trigger: 'h1:contains("Contact us")',
run: function () {}, // it's a check
},
]);
});

View file

@ -0,0 +1,57 @@
odoo.define('website_event_sale.tour.event_sale_pricelists_different_currencies', function (require) {
'use strict';
const tour = require('web_tour.tour');
const { getPriceListChecksSteps } = require('website_event_sale.tour.WebsiteEventSaleTourMethods');
tour.register('event_sale_pricelists_different_currencies', {
test: true,
url: '/event',
},[
// Register for tickets
{
content: "Open the Pycon event",
trigger: '.o_wevent_events_list a:contains("Pycon")',
},
{
content: "Register",
trigger: '.btn-primary:contains("Register")',
},
{
content: "Fill attendees details",
trigger: 'form[id="attendee_registration"] .btn:contains("Continue")',
run: function () {
$("input[name='1-name']").val("Great Name");
$("input[name='1-phone']").val("111 111");
$("input[name='1-email']").val("great@name.com");
},
},
{
content: "Validate attendees details",
extra_trigger: "input[name='1-name'], input[name='2-name']",
trigger: 'button:contains("Continue")',
},
...getPriceListChecksSteps({
pricelistName: "EUR With Discount Included",
eventName: "Pycon",
price: "90.00",
}),
...getPriceListChecksSteps({
pricelistName: "EUR Without Discount Included",
eventName: "Pycon",
price: "90.00",
priceBeforeDiscount: "100.00",
}),
...getPriceListChecksSteps({
pricelistName: "EX With Discount Included",
eventName: "Pycon",
price: "900.00",
}),
...getPriceListChecksSteps({
pricelistName: "EX Without Discount Included",
eventName: "Pycon",
price: "900.00",
priceBeforeDiscount: "1,000.00",
}),
]);
});