@mirai/core 0.3.380 → 0.3.382
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__tests__/Booking/__mocks__/booking-delete.json +1 -0
- package/__tests__/Booking/__mocks__/booking-get.json +105 -0
- package/__tests__/Booking/booking.constants.js +8 -0
- package/__tests__/Booking/workflows/cancel.workflow.js +20 -0
- package/__tests__/Booking/workflows/index.js +5 -0
- package/__tests__/Booking/workflows/openMobileMenu.workflow.js +4 -0
- package/__tests__/Booking/workflows/print.workflow.js +13 -0
- package/__tests__/Booking/workflows/resend.workflow.js +18 -0
- package/__tests__/Booking/workflows/review.workflow.js +17 -0
- package/__tests__/Checkout/workflows/form.workflow.js +1 -1
- package/__tests__/Checkout/workflows/review.workflow.js +1 -1
- package/__tests__/Session/workflows/bookings.workflow.js +3 -3
- package/__tests__/Session/workflows/logout.workflow.js +3 -3
- package/__tests__/Session/workflows/profile.workflow.js +3 -3
- package/__tests__/Signup/workflows/index.js +1 -0
- package/__tests__/Signup/workflows/signup.workflow.js +3 -3
- package/__tests__/Signup/workflows/signupError.workflow.js +22 -0
- package/__tests__/booking.spec.jsx +34 -0
- package/__tests__/{bookingQuery/bookingQuey._spec.js → bookingQuey._spec.js} +1 -2
- package/__tests__/{Checkout/checkout.spec.jsx → checkout.spec.jsx} +6 -4
- package/__tests__/constants.js +3 -1
- package/__tests__/{Finder/finder.spec.js → finder.spec.js} +14 -13
- package/__tests__/{Rates/rates.spec.jsx → rates.spec.jsx} +1 -1
- package/__tests__/session.spec.js +32 -0
- package/__tests__/{Signup/signup.spec.js → signup.spec.js} +8 -4
- package/build/components/Booking/Booking.js +1 -0
- package/build/components/Booking/Booking.js.map +1 -1
- package/build/components/Booking/partials/Booking.Menu.js +4 -2
- package/build/components/Booking/partials/Booking.Menu.js.map +1 -1
- package/build/components/Booking/partials/Booking.Modal.js +4 -2
- package/build/components/Booking/partials/Booking.Modal.js.map +1 -1
- package/build/components/Booking/partials/__tests__/__snapshots__/Booking.Menu.test.js.snap +20 -0
- package/build/components/Booking/partials/__tests__/__snapshots__/Booking.Modal.test.js.snap +8 -0
- package/build/components/Session/Session.Account.js +2 -3
- package/build/components/Session/Session.Account.js.map +1 -1
- package/build/components/Session/__tests__/__snapshots__/Session.test.js.snap +2 -2
- package/build/components/__shared__/ButtonPayment/components/FormSipay/__tests__/__snapshots__/FormSipay.test.js.snap +6 -6
- package/build/components/__shared__/Occupation/__tests__/__snapshots__/Occupation.test.js.snap +4 -4
- package/build/helpers/sanitizeComponent.js +1 -0
- package/build/helpers/sanitizeComponent.js.map +1 -1
- package/package.json +2 -2
- package/public/index.html +6 -1
- package/__tests__/Session/session.spec.js +0 -17
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "status": "UNKNOWN", "message": null, "data": null }
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "OK",
|
|
3
|
+
"message": "",
|
|
4
|
+
"data": {
|
|
5
|
+
"id": 24080753785,
|
|
6
|
+
"pinCode": 3518230,
|
|
7
|
+
"state": 1,
|
|
8
|
+
"checkIn": "10/04/2025",
|
|
9
|
+
"checkOut": "15/04/2025",
|
|
10
|
+
"checkInTime": "12:00",
|
|
11
|
+
"checkOutTime": "17:00",
|
|
12
|
+
"currency": "EUR",
|
|
13
|
+
"contact": [{ "name": "Hal Finney" }, { "email": "hello@soyjavi.com" }, { "phone": "+1 8185551234" }],
|
|
14
|
+
"hotel": {
|
|
15
|
+
"address": "Mariano Pola, 13",
|
|
16
|
+
"city": "33212, Gijón, Asturias",
|
|
17
|
+
"country": "Spain",
|
|
18
|
+
"email": "info@mirai.com",
|
|
19
|
+
"location": [43.5402473, -5.6783805],
|
|
20
|
+
"name": "Hotel Monalisa Test ***",
|
|
21
|
+
"phone": "+34 915 91 35 00",
|
|
22
|
+
"site": "https://monalisa.mirai.com/"
|
|
23
|
+
},
|
|
24
|
+
"details": [
|
|
25
|
+
{
|
|
26
|
+
"amount": 1,
|
|
27
|
+
"image": "https://images.mirai.com/INFOROOMS/100379008/c26IDLXClcR4v3KTbRmK/c26IDLXClcR4v3KTbRmK_medium.jpg",
|
|
28
|
+
"observations": [],
|
|
29
|
+
"occupation": { "adults": 3, "children": 0, "babies": 1 },
|
|
30
|
+
"rate": "Pay now",
|
|
31
|
+
"type": "Suite",
|
|
32
|
+
"items": [
|
|
33
|
+
{ "date": "10/04/2025", "description": "", "price": 58.4, "summary": "Breakfast Included" },
|
|
34
|
+
{ "date": "11/04/2025", "description": "", "price": 58.4, "summary": "Breakfast Included" },
|
|
35
|
+
{ "date": "12/04/2025", "description": "", "price": 58.4, "summary": "Breakfast Included" },
|
|
36
|
+
{ "date": "13/04/2025", "description": "", "price": 58.4, "summary": "Breakfast Included" },
|
|
37
|
+
{ "date": "14/04/2025", "description": "", "price": 58.4, "summary": "Breakfast Included" }
|
|
38
|
+
],
|
|
39
|
+
"extras": []
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"extras": [
|
|
43
|
+
{
|
|
44
|
+
"amount": 2,
|
|
45
|
+
"description": "Sólo si falta alguna condición o restricción que quieres que quede por escrito (este texto irá en las confirmaciones de reservas).",
|
|
46
|
+
"id": 69632,
|
|
47
|
+
"price": 40.0,
|
|
48
|
+
"summary": "For 2 adults",
|
|
49
|
+
"title": "only adults, choose adults",
|
|
50
|
+
"type": "PERSON_ONCE"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"amount": 1,
|
|
54
|
+
"id": 65573,
|
|
55
|
+
"summary": "For 1 apartment",
|
|
56
|
+
"title": "free- Por habitación / una vez:",
|
|
57
|
+
"type": "ROOM_ONCE"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"amount": 1,
|
|
61
|
+
"description": "Proin ullamcorper fringilla dui, sit amet sagittis ante porttitor ac. Phasellus at porta tellus, at ultricies neque.",
|
|
62
|
+
"id": 65349,
|
|
63
|
+
"price": 100.0,
|
|
64
|
+
"summary": "",
|
|
65
|
+
"title": "Una unidad por reserva:",
|
|
66
|
+
"type": "RESERVE_ONCE"
|
|
67
|
+
}
|
|
68
|
+
],
|
|
69
|
+
"otherConditions": "This is a example of other conditions",
|
|
70
|
+
"paymentsConditions": "Prepayment required of 100%: Book now, provide your card details later. Possibility of providing the card details within 5 days.",
|
|
71
|
+
"price": {
|
|
72
|
+
"value": 565.2,
|
|
73
|
+
"base": 432.0,
|
|
74
|
+
"description": "+43.20 € VAT, +90.00 € Local taxes",
|
|
75
|
+
"prepayment": { "TPV": { "value": 475.2, "currency": "EUR" } }
|
|
76
|
+
},
|
|
77
|
+
"priceBreakdown": {
|
|
78
|
+
"basePrice": 432.0,
|
|
79
|
+
"taxes": [{ "amount": 10.0, "price": 43.2, "type": 0, "applyTo": [1, 2] }],
|
|
80
|
+
"fees": [{ "price": 90.0, "type": 1, "age": 16 }]
|
|
81
|
+
},
|
|
82
|
+
"cancelationPolicy": {
|
|
83
|
+
"summary": "Special conditions: Penalty if canceled",
|
|
84
|
+
"detail": "When the hotel receives your reservation, the total amount will be charged on your card. No refund will be made in case of cancellation, early departure or no-show (the reservation is kept up to the 1st night). If the charge to your card is denied, the hotel will cancel your reservation. "
|
|
85
|
+
},
|
|
86
|
+
"units": 1,
|
|
87
|
+
"payment": {
|
|
88
|
+
"config": {
|
|
89
|
+
"cards": ["AMERICAN_EXPRESS", "VISA", "MASTERCARD"],
|
|
90
|
+
"currencyDecimals": 2,
|
|
91
|
+
"provider": "REDUNIQ",
|
|
92
|
+
"publicKey": {},
|
|
93
|
+
"showCVV": true
|
|
94
|
+
},
|
|
95
|
+
"info": {
|
|
96
|
+
"amount": 475.2,
|
|
97
|
+
"amountRaw": 47520,
|
|
98
|
+
"cardValidation": false,
|
|
99
|
+
"time": { "value": 1723499999999, "now": 1722998010821, "deadlineExpired": false }
|
|
100
|
+
},
|
|
101
|
+
"methods": ["TPV"]
|
|
102
|
+
},
|
|
103
|
+
"postponable": false
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const PAGE_URL = 'http://local.mirai.com:8080/step3-booking';
|
|
2
|
+
|
|
3
|
+
const URL_PARAMS = {
|
|
4
|
+
DEFAULT:
|
|
5
|
+
'?code=49BBD2F87DBE604D1BBD734D12CB6F2C7682B94B&env=dev&home=http%3A%2F%2Flocal.mirai.com%3A8080%2F&idHotel=100379008&lang=en&reservationCode=24080695775&type=hotel&version=2&serverNameForSSL=reservation.mirai.com&outsideHotelDomain=true',
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export { PAGE_URL, URL_PARAMS };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { expect } from '@playwright/test';
|
|
2
|
+
|
|
3
|
+
import { openMobileMenu } from './openMobileMenu.workflow';
|
|
4
|
+
|
|
5
|
+
export const cancel = async ({ isMobile, page }) => {
|
|
6
|
+
if (isMobile) await openMobileMenu({ page });
|
|
7
|
+
await page.getByTestId('booking-menu-2').click();
|
|
8
|
+
|
|
9
|
+
await page.locator('input[type="radio"][name="cancel"][value="5"]').check();
|
|
10
|
+
await page.fill(
|
|
11
|
+
'input[name="comments"]',
|
|
12
|
+
'Due to unforeseen circumstances, I need to cancel my hotel reservation. Thank you for your understanding.',
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
const [response] = await Promise.all([
|
|
16
|
+
page.waitForResponse((response) => response.url().includes('/reservation') && !!response.status()),
|
|
17
|
+
await page.getByTestId('submit-button').click(),
|
|
18
|
+
]);
|
|
19
|
+
expect(response.status()).toBe(200);
|
|
20
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { openMobileMenu } from './openMobileMenu.workflow';
|
|
2
|
+
|
|
3
|
+
export const print = async ({ isMobile, page }) => {
|
|
4
|
+
if (isMobile) await openMobileMenu({ page });
|
|
5
|
+
|
|
6
|
+
page.on('dialog', async (dialog) => {
|
|
7
|
+
if (dialog.type() === 'print') {
|
|
8
|
+
await dialog.dismiss();
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
await page.getByTestId('booking-menu-0').click();
|
|
13
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { expect } from '@playwright/test';
|
|
2
|
+
|
|
3
|
+
import { openMobileMenu } from './openMobileMenu.workflow';
|
|
4
|
+
import { USER } from '../../constants';
|
|
5
|
+
|
|
6
|
+
export const resend = async ({ isMobile, page }) => {
|
|
7
|
+
if (isMobile) await openMobileMenu({ page });
|
|
8
|
+
|
|
9
|
+
await page.getByTestId('booking-menu-1').click();
|
|
10
|
+
await page.fill('input[name="email"]', USER.email);
|
|
11
|
+
|
|
12
|
+
const [response] = await Promise.all([
|
|
13
|
+
page.waitForResponse((response) => response.url().includes('/resend_reservation') && !!response.status()),
|
|
14
|
+
page.getByTestId('submit-button').click(),
|
|
15
|
+
]);
|
|
16
|
+
|
|
17
|
+
expect(response.status()).toBe(200);
|
|
18
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { expect } from '@playwright/test';
|
|
2
|
+
|
|
3
|
+
export const review = async ({ isMobile, page }) => {
|
|
4
|
+
// Expand more info
|
|
5
|
+
if (!isMobile) {
|
|
6
|
+
expect(await page.locator('text="Booking extras"').count()).toEqual(0);
|
|
7
|
+
await page.getByTestId('button-more').click();
|
|
8
|
+
}
|
|
9
|
+
await page.locator('text="Booking extras"').isVisible();
|
|
10
|
+
|
|
11
|
+
// Change language
|
|
12
|
+
const [responseError] = await Promise.all([
|
|
13
|
+
page.waitForResponse((response) => response.url().includes('/dictionary?locale=es-ES') && !!response.status()),
|
|
14
|
+
page.locator('select[name="locale"]').selectOption('Español'),
|
|
15
|
+
]);
|
|
16
|
+
expect(responseError.status()).toBe(200);
|
|
17
|
+
};
|
|
@@ -12,6 +12,6 @@ export const form = async ({ page }) => {
|
|
|
12
12
|
|
|
13
13
|
// User submits but forgots privacy policy
|
|
14
14
|
await page.getByTestId('checkout-button').click();
|
|
15
|
-
await page.waitForSelector('ui-notification', { state: 'visible' });
|
|
15
|
+
await page.waitForSelector('ui-notification-error', { state: 'visible' });
|
|
16
16
|
await page.locator('ui-checkout form input[name="privacyPolicy"]').check();
|
|
17
17
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { expect } from '@playwright/test';
|
|
2
2
|
|
|
3
|
-
export const bookings = async ({ page }) => {
|
|
4
|
-
await page.getByTestId('show-
|
|
5
|
-
await page.getByTestId(
|
|
3
|
+
export const bookings = async ({ isMobile, page }) => {
|
|
4
|
+
await page.getByTestId('show-profile-menu').click();
|
|
5
|
+
await page.getByTestId(`profile-menu-${isMobile ? 2 : 1}`).click();
|
|
6
6
|
|
|
7
7
|
await page.waitForURL(/\/profile/, { waitUntil: 'networkidle', timeout: 10000 });
|
|
8
8
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { expect } from '@playwright/test';
|
|
2
2
|
|
|
3
|
-
export const logout = async ({ page }) => {
|
|
4
|
-
await page.getByTestId('show-
|
|
5
|
-
await page.getByTestId(
|
|
3
|
+
export const logout = async ({ isMobile, page }) => {
|
|
4
|
+
await page.getByTestId('show-profile-menu').click();
|
|
5
|
+
await page.getByTestId(`profile-menu-${isMobile ? 3 : 2}`).click();
|
|
6
6
|
|
|
7
7
|
await expect(page.getByTestId('show-login')).toBeVisible();
|
|
8
8
|
};
|
|
@@ -5,9 +5,9 @@ import { SESSION, USER } from '../../constants';
|
|
|
5
5
|
// ! TODO: Somehow we should close the notifications
|
|
6
6
|
// import { closeNotification } from '../../helpers';
|
|
7
7
|
|
|
8
|
-
export const profile = async ({ page }) => {
|
|
9
|
-
await page.getByTestId('show-
|
|
10
|
-
await page.getByTestId(
|
|
8
|
+
export const profile = async ({ isMobile, page }) => {
|
|
9
|
+
await page.getByTestId('show-profile-menu').click();
|
|
10
|
+
await page.getByTestId(`profile-menu-${isMobile ? 1 : 0}`).click();
|
|
11
11
|
|
|
12
12
|
await page.waitForURL(/\/profile/, { waitUntil: 'networkidle', timeout: 10000 });
|
|
13
13
|
|
|
@@ -5,7 +5,7 @@ import { USER } from '../../constants';
|
|
|
5
5
|
export const signup = async ({ page }) => {
|
|
6
6
|
await page.fill('ui-signup input[name="firstName"]', USER.firstName);
|
|
7
7
|
await page.fill('ui-signup input[name="lastName"]', USER.lastName);
|
|
8
|
-
await page.fill('ui-signup input[name="email"]',
|
|
8
|
+
await page.fill('ui-signup input[name="email"]', `${new Date().getTime()}@mail.com`);
|
|
9
9
|
await page.fill('ui-signup input[name="dateOfBirth"]', USER.dateOfBirth);
|
|
10
10
|
await page.locator('ui-signup select[name="country"]').selectOption('United States');
|
|
11
11
|
await page.fill('ui-signup input[name="password"]', USER.password);
|
|
@@ -13,7 +13,7 @@ export const signup = async ({ page }) => {
|
|
|
13
13
|
|
|
14
14
|
// User forgot some fields
|
|
15
15
|
await page.getByTestId('signup-button').click();
|
|
16
|
-
await page.waitForSelector('ui-notification', { state: 'visible' });
|
|
16
|
+
await page.waitForSelector('ui-notification-error', { state: 'visible' });
|
|
17
17
|
await page.locator('input[name="privacy"]').check();
|
|
18
18
|
|
|
19
19
|
// Success
|
|
@@ -22,5 +22,5 @@ export const signup = async ({ page }) => {
|
|
|
22
22
|
page.getByTestId('signup-button').click(),
|
|
23
23
|
]);
|
|
24
24
|
|
|
25
|
-
expect(responseError.status()).toBe(
|
|
25
|
+
expect(responseError.status()).toBe(201);
|
|
26
26
|
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { expect } from '@playwright/test';
|
|
2
|
+
|
|
3
|
+
import { USER } from '../../constants';
|
|
4
|
+
|
|
5
|
+
export const signupError = async ({ page }) => {
|
|
6
|
+
await page.fill('ui-signup input[name="firstName"]', USER.firstName);
|
|
7
|
+
await page.fill('ui-signup input[name="lastName"]', USER.lastName);
|
|
8
|
+
await page.fill('ui-signup input[name="email"]', USER.email);
|
|
9
|
+
await page.fill('ui-signup input[name="dateOfBirth"]', USER.dateOfBirth);
|
|
10
|
+
await page.locator('ui-signup select[name="country"]').selectOption('United States');
|
|
11
|
+
await page.fill('ui-signup input[name="password"]', USER.password);
|
|
12
|
+
await page.locator('ui-signup input[name="subscribed"]').check();
|
|
13
|
+
await page.locator('input[name="privacy"]').check();
|
|
14
|
+
|
|
15
|
+
// Success
|
|
16
|
+
const [responseError] = await Promise.all([
|
|
17
|
+
page.waitForResponse((response) => response.url().includes('/join') && !!response.status()),
|
|
18
|
+
page.getByTestId('signup-button').click(),
|
|
19
|
+
]);
|
|
20
|
+
|
|
21
|
+
expect(responseError.status()).toBe(409);
|
|
22
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { test } from '@playwright/test';
|
|
2
|
+
|
|
3
|
+
import { PAGE_URL, URL_PARAMS } from './Booking/booking.constants';
|
|
4
|
+
import { cancel, print, resend, review } from './Booking/workflows';
|
|
5
|
+
|
|
6
|
+
test.beforeEach(async ({ context, page }) => {
|
|
7
|
+
await context.addInitScript(() => (window.IS_PLAYWRIGHT = true));
|
|
8
|
+
|
|
9
|
+
await page.route('https://reservation.mirai.com/XMAS/reservation/v2/booking/*', (route) => {
|
|
10
|
+
route.fulfill({
|
|
11
|
+
status: 200,
|
|
12
|
+
contentType: 'application/json',
|
|
13
|
+
body: JSON.stringify(require(`./Booking/__mocks__/booking-${route.request().method().toLowerCase()}.json`)),
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
await page.goto(`${PAGE_URL}${URL_PARAMS.DEFAULT}`, { waitUntil: 'networkidle', timeout: 10000 });
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test(`Review`, async ({ isMobile, page }) => {
|
|
21
|
+
await review({ isMobile, page });
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test(`Print`, async ({ isMobile, page }) => {
|
|
25
|
+
await print({ isMobile, page });
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test(`Resend`, async ({ isMobile, page }) => {
|
|
29
|
+
await resend({ isMobile, page });
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test(`Cancel`, async ({ isMobile, page }) => {
|
|
33
|
+
await cancel({ isMobile, page });
|
|
34
|
+
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { test } from '@playwright/test';
|
|
2
2
|
|
|
3
|
-
import { PAGE_URL, URL_PARAMS } from './checkout.constants';
|
|
4
|
-
import { form, payment, review, submit } from './workflows';
|
|
3
|
+
import { PAGE_URL, URL_PARAMS } from './Checkout/checkout.constants';
|
|
4
|
+
import { form, payment, review, submit } from './Checkout/workflows';
|
|
5
5
|
|
|
6
6
|
const PAYMENTS = ['PAYLATER', 'TPV', 'TRANSFER'];
|
|
7
7
|
|
|
@@ -16,7 +16,9 @@ const enviroment = async ({ page, payment }) => {
|
|
|
16
16
|
route.fulfill({
|
|
17
17
|
status: 200,
|
|
18
18
|
contentType: 'application/json',
|
|
19
|
-
body: JSON.stringify(
|
|
19
|
+
body: JSON.stringify(
|
|
20
|
+
require(`./Checkout/__mocks__/checkout-${method}${method === 'post' ? `-${payment}` : ''}.json`),
|
|
21
|
+
),
|
|
20
22
|
});
|
|
21
23
|
});
|
|
22
24
|
|
|
@@ -24,7 +26,7 @@ const enviroment = async ({ page, payment }) => {
|
|
|
24
26
|
};
|
|
25
27
|
|
|
26
28
|
PAYMENTS.forEach((paymentId) => {
|
|
27
|
-
test(`
|
|
29
|
+
test(`Payment w/ ${paymentId}`, async ({ page }) => {
|
|
28
30
|
await enviroment({ page, payment: paymentId });
|
|
29
31
|
|
|
30
32
|
await form({ page });
|
package/__tests__/constants.js
CHANGED
|
@@ -1,40 +1,41 @@
|
|
|
1
1
|
import { expect, test } from '@playwright/test';
|
|
2
2
|
|
|
3
|
-
import { calendar, occupation, promocode } from './workflows';
|
|
3
|
+
import { calendar, occupation, promocode } from './Finder/workflows';
|
|
4
4
|
|
|
5
5
|
const testId = 'finder';
|
|
6
6
|
|
|
7
7
|
test.beforeEach(async ({ context, page }) => {
|
|
8
8
|
await context.addInitScript(() => (window.IS_PLAYWRIGHT = true));
|
|
9
|
-
|
|
9
|
+
|
|
10
|
+
await page.goto('http://local.mirai.com:8080', { waitUntil: 'networkidle', timeout: 10000 });
|
|
10
11
|
});
|
|
11
12
|
|
|
12
|
-
test('
|
|
13
|
+
test('Search (default)', async ({ page }) => {
|
|
13
14
|
await calendar({ page, testId });
|
|
14
15
|
await page.getByTestId(`${testId}-submit`).click();
|
|
15
16
|
|
|
16
|
-
await expect(page).toHaveURL(/.*step1-rates/, { timeout:
|
|
17
|
+
await expect(page).toHaveURL(/.*step1-rates/, { timeout: 10000 });
|
|
17
18
|
});
|
|
18
19
|
|
|
19
|
-
test('
|
|
20
|
+
test('Search w/ +1 adult', async ({ isMobile, page }) => {
|
|
20
21
|
await calendar({ isMobile, page, testId });
|
|
21
22
|
await occupation({ addAdult: true, isMobile, page, testId });
|
|
22
23
|
|
|
23
24
|
await page.getByTestId(`${testId}-submit`).click();
|
|
24
25
|
|
|
25
|
-
await expect(page).toHaveURL(/.*step1-rates/, { timeout:
|
|
26
|
+
await expect(page).toHaveURL(/.*step1-rates/, { timeout: 10000 });
|
|
26
27
|
});
|
|
27
28
|
|
|
28
|
-
test('
|
|
29
|
+
test('Search w/ +1 child', async ({ isMobile, page }) => {
|
|
29
30
|
await calendar({ isMobile, page, testId });
|
|
30
31
|
await occupation({ addChild: true, isMobile, page, testId });
|
|
31
32
|
|
|
32
33
|
await page.getByTestId(`${testId}-submit`).click();
|
|
33
34
|
|
|
34
|
-
await expect(page).toHaveURL(/.*step1-rates/, { timeout:
|
|
35
|
+
await expect(page).toHaveURL(/.*step1-rates/, { timeout: 10000 });
|
|
35
36
|
});
|
|
36
37
|
|
|
37
|
-
test('
|
|
38
|
+
test('Search w/ +1 child widhout age', async ({ isMobile, page }) => {
|
|
38
39
|
await calendar({ isMobile, page, testId });
|
|
39
40
|
await occupation({ addAgeChild: false, addChild: true, isMobile, page, testId });
|
|
40
41
|
|
|
@@ -44,21 +45,21 @@ test('Finder search with child added and not age', async ({ isMobile, page }) =>
|
|
|
44
45
|
else await expect(page.getByTestId(`${testId}-occupation`)).toBeVisible();
|
|
45
46
|
});
|
|
46
47
|
|
|
47
|
-
test('
|
|
48
|
+
test('Search w/ promocode', async ({ isMobile, page }) => {
|
|
48
49
|
await calendar({ isMobile, page, testId });
|
|
49
50
|
await promocode({ isMobile, page, testId });
|
|
50
51
|
|
|
51
52
|
await page.getByTestId(`${testId}-submit`).click();
|
|
52
53
|
|
|
53
|
-
await expect(page).toHaveURL(/.*step1-rates/, { timeout:
|
|
54
|
+
await expect(page).toHaveURL(/.*step1-rates/, { timeout: 10000 });
|
|
54
55
|
});
|
|
55
56
|
|
|
56
|
-
test('
|
|
57
|
+
test('Search w/ +1 adult & promocode', async ({ isMobile, page }) => {
|
|
57
58
|
await calendar({ isMobile, page, testId });
|
|
58
59
|
await occupation({ addAdult: true, isMobile, page, testId });
|
|
59
60
|
await promocode({ isMobile, page, testId });
|
|
60
61
|
|
|
61
62
|
await page.getByTestId(`${testId}-submit`).click();
|
|
62
63
|
|
|
63
|
-
await expect(page).toHaveURL(/.step1-rates/, { timeout:
|
|
64
|
+
await expect(page).toHaveURL(/.step1-rates/, { timeout: 10000 });
|
|
64
65
|
});
|
|
@@ -9,7 +9,7 @@ test('Rates workflows', async ({ page }) => {
|
|
|
9
9
|
route.fulfill({
|
|
10
10
|
status: 200,
|
|
11
11
|
contentType: 'application/json',
|
|
12
|
-
body: JSON.stringify(require('./__mocks__/rates-success.json')),
|
|
12
|
+
body: JSON.stringify(require('./Rates/__mocks__/rates-success.json')),
|
|
13
13
|
});
|
|
14
14
|
});
|
|
15
15
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { test } from '@playwright/test';
|
|
2
|
+
|
|
3
|
+
import { bookings, forgotPassword, login, logout, profile } from './Session/workflows';
|
|
4
|
+
|
|
5
|
+
test.beforeEach(async ({ context, page }) => {
|
|
6
|
+
await context.addInitScript(() => (window.IS_PLAYWRIGHT = true));
|
|
7
|
+
|
|
8
|
+
await page.goto('http://local.mirai.com:8080', { waitUntil: 'networkidle', timeout: 10000 });
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
test('Login', async ({ isMobile, page }) => {
|
|
12
|
+
await login({ isMobile, page });
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test('Edit profile', async ({ isMobile, page }) => {
|
|
16
|
+
await login({ isMobile, page });
|
|
17
|
+
await profile({ isMobile, page });
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test('View bookings', async ({ isMobile, page }) => {
|
|
21
|
+
await login({ isMobile, page });
|
|
22
|
+
await bookings({ isMobile, page });
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test('Logout', async ({ isMobile, page }) => {
|
|
26
|
+
await login({ isMobile, page });
|
|
27
|
+
await logout({ isMobile, page });
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('Forgot password', async ({ isMobile, page }) => {
|
|
31
|
+
await forgotPassword({ isMobile, page });
|
|
32
|
+
});
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { test } from '@playwright/test';
|
|
2
2
|
|
|
3
|
-
import { signup } from './workflows';
|
|
3
|
+
import { signup, signupError } from './Signup/workflows';
|
|
4
4
|
|
|
5
|
-
test.beforeEach(async ({ context }) => {
|
|
5
|
+
test.beforeEach(async ({ context, page }) => {
|
|
6
6
|
await context.addInitScript(() => (window.IS_PLAYWRIGHT = true));
|
|
7
|
-
});
|
|
8
7
|
|
|
9
|
-
test('Signup workflows', async ({ page }) => {
|
|
10
8
|
await page.goto('http://local.mirai.com:8080/signup', { waitUntil: 'networkidle', timeout: 10000 });
|
|
9
|
+
});
|
|
11
10
|
|
|
11
|
+
test('Signup', async ({ page }) => {
|
|
12
12
|
await signup({ page });
|
|
13
13
|
});
|
|
14
|
+
|
|
15
|
+
test('User already exists', async ({ page }) => {
|
|
16
|
+
await signupError({ page });
|
|
17
|
+
});
|
|
@@ -130,6 +130,7 @@ const Booking = _ref => {
|
|
|
130
130
|
}), /*#__PURE__*/_react.default.createElement(_shared__.BookingDetails, {
|
|
131
131
|
dataSource,
|
|
132
132
|
expanded,
|
|
133
|
+
expanded: isMobile,
|
|
133
134
|
className: style.box
|
|
134
135
|
}), /*#__PURE__*/_react.default.createElement(_shared__.BookingTerms, {
|
|
135
136
|
dataSource: dataSource,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Booking.js","names":["_dataSources","require","_locale","_services","_ui","_propTypes","_interopRequireDefault","_react","_interopRequireWildcard","_Booking","_Booking2","style","_Booking3","_components","_partials","_Booking4","_shared__","_Header","_helpers","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","obj","Booking","_ref","skeleton","others","isDesktop","isMobile","useDevice","locale","translate","useLocale","value","hotel","url","urlParams","code","token","reservationCode","id","hasToTracking","tracking","useStore","action","setAction","useState","dataSource","setDataSource","expanded","setExpanded","responseError","setResponseError","useEffect","ServiceBooking","catch","error","trace","chainId","idchain","state","handleMenuPress","ACTION","PRINT","setTimeout","window","print","handleBackHome","payload","hotelUrl","location","origin","payment","response","undefined","isCancelled","STATE","CANCELLED","createElement","Fragment","Header","View","role","testId","className","styles","container","Progress","indeterminate","visible","progress","row","content","POS_ERROR","Notification","info","COMPLETED","small","success","CONFIRMED","warning","POSTPONED","wide","L10N","NOTIFICATION","Hotelverse","BookingPayment","onError","BookingSummary","box","showBasePrice","Information","BookingDetails","BookingTerms","side","noPrint","Menu","onPress","Modal","onChange","_ref2","onClose","large","NOTIFICATION_ERROR","ERROR","GENERIC","Action","paragraph","underline","ACTION_BACK_HOME","Footer","exports","displayName","propTypes","PropTypes","bool"],"sources":["../../../src/components/Booking/Booking.jsx"],"sourcesContent":["import { useStore } from '@mirai/data-sources';\nimport { useLocale } from '@mirai/locale';\nimport { ServiceBooking } from '@mirai/services';\nimport { Action, Notification, Progress, styles, useDevice, View } from '@mirai/ui';\nimport PropTypes from 'prop-types';\nimport React, { useEffect, useState } from 'react';\n\nimport { ACTION, ERROR, STATE } from './Booking.constants';\nimport { L10N } from './Booking.l10n';\nimport * as style from './Booking.module.css';\nimport Skeleton from './Booking.skeleton';\nimport { Hotelverse } from './components';\nimport { Information, Menu, Modal } from './partials';\nimport { BookingPayment } from './partials/Booking.Payment';\nimport { BookingDetails, BookingSummary, BookingTerms, Footer } from '../__shared__';\nimport { Header } from '../Header';\nimport { trace } from '../helpers';\n\nconst Booking = ({ skeleton, ...others }) => {\n const { isDesktop, isMobile } = useDevice();\n const { locale, translate } = useLocale();\n const {\n value: {\n hotel: { url } = {},\n urlParams: { code: token, reservationCode: id, hasToTracking: tracking, ...urlParams } = {},\n },\n } = useStore();\n\n const [action, setAction] = useState();\n const [dataSource, setDataSource] = useState();\n const [expanded, setExpanded] = useState(false);\n const [responseError, setResponseError] = useState();\n\n useEffect(() => {\n if (skeleton || !id || !token) return;\n\n (async () => {\n setDataSource(\n await ServiceBooking.get({ id, locale, token, tracking, url }).catch((error) => setResponseError(error)),\n );\n setAction();\n })();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id, locale]);\n\n useEffect(() => {\n if (!dataSource) return;\n\n dataSource.tracking && trace({ ...dataSource.tracking, chainId: urlParams.idchain });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dataSource?.state]);\n\n const handleMenuPress = (action) => {\n if (action === ACTION.PRINT) {\n setExpanded(true);\n setTimeout(window.print, 10);\n } else {\n setAction(action);\n }\n };\n\n const handleBackHome = () => {\n const { payload: { hotelUrl } = {} } = responseError;\n\n window.location = hotelUrl || window.location.origin;\n };\n\n const { payment, state } = dataSource || {};\n const response = dataSource !== undefined;\n const isCancelled = state === STATE.CANCELLED;\n\n return (\n <>\n <Header />\n\n <View role=\"booking\" testId={others.testId} className={styles(style.container, others.className)}>\n <Progress indeterminate visible={!response && !responseError} className={style.progress} />\n {response ? (\n <>\n <View row={isDesktop} className={style.content}>\n <View>\n {state !== STATE.POS_ERROR && (\n <Notification\n error={isCancelled}\n info={state === STATE.COMPLETED}\n small={isMobile}\n success={state === STATE.CONFIRMED}\n warning={state === STATE.POSTPONED}\n wide\n >\n {translate(L10N.NOTIFICATION[state])}\n <Hotelverse {...dataSource} />\n </Notification>\n )}\n\n {payment && !isCancelled && <BookingPayment {...{ dataSource, onError: setResponseError }} />}\n\n <BookingSummary\n box={!isDesktop}\n dataSource={{ ...dataSource, showBasePrice: true }}\n className={styles(isDesktop && style.print)}\n />\n\n <Information dataSource={dataSource} />\n <BookingDetails {...{ dataSource, expanded }} className={style.box} />\n <BookingTerms dataSource={dataSource} small />\n </View>\n\n <View className={style.side}>\n {isDesktop && (\n <BookingSummary box dataSource={{ ...dataSource, showBasePrice: true }} className={style.noPrint} />\n )}\n\n <Menu dataSource={dataSource} onPress={handleMenuPress} />\n </View>\n </View>\n\n <Modal\n {...{ action, dataSource: { ...dataSource, token } }}\n onChange={({ response: { tracking } = {}, state }) =>\n state && setDataSource({ ...dataSource, tracking, state })\n }\n onClose={() => setAction()}\n />\n </>\n ) : responseError ? (\n <Notification error large className={style.error}>\n {translate(L10N.NOTIFICATION_ERROR[responseError.code] || L10N.NOTIFICATION_ERROR[ERROR.GENERIC])}\n <Action paragraph underline wide onPress={handleBackHome}>\n {translate(L10N.ACTION_BACK_HOME)}\n </Action>\n </Notification>\n ) : (\n <Skeleton />\n )}\n </View>\n\n <Footer />\n </>\n );\n};\n\nBooking.displayName = 'Mirai:Core:Booking';\n\nBooking.propTypes = {\n skeleton: PropTypes.bool,\n};\n\nexport { Booking };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Booking.js","names":["_dataSources","require","_locale","_services","_ui","_propTypes","_interopRequireDefault","_react","_interopRequireWildcard","_Booking","_Booking2","style","_Booking3","_components","_partials","_Booking4","_shared__","_Header","_helpers","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","obj","Booking","_ref","skeleton","others","isDesktop","isMobile","useDevice","locale","translate","useLocale","value","hotel","url","urlParams","code","token","reservationCode","id","hasToTracking","tracking","useStore","action","setAction","useState","dataSource","setDataSource","expanded","setExpanded","responseError","setResponseError","useEffect","ServiceBooking","catch","error","trace","chainId","idchain","state","handleMenuPress","ACTION","PRINT","setTimeout","window","print","handleBackHome","payload","hotelUrl","location","origin","payment","response","undefined","isCancelled","STATE","CANCELLED","createElement","Fragment","Header","View","role","testId","className","styles","container","Progress","indeterminate","visible","progress","row","content","POS_ERROR","Notification","info","COMPLETED","small","success","CONFIRMED","warning","POSTPONED","wide","L10N","NOTIFICATION","Hotelverse","BookingPayment","onError","BookingSummary","box","showBasePrice","Information","BookingDetails","BookingTerms","side","noPrint","Menu","onPress","Modal","onChange","_ref2","onClose","large","NOTIFICATION_ERROR","ERROR","GENERIC","Action","paragraph","underline","ACTION_BACK_HOME","Footer","exports","displayName","propTypes","PropTypes","bool"],"sources":["../../../src/components/Booking/Booking.jsx"],"sourcesContent":["import { useStore } from '@mirai/data-sources';\nimport { useLocale } from '@mirai/locale';\nimport { ServiceBooking } from '@mirai/services';\nimport { Action, Notification, Progress, styles, useDevice, View } from '@mirai/ui';\nimport PropTypes from 'prop-types';\nimport React, { useEffect, useState } from 'react';\n\nimport { ACTION, ERROR, STATE } from './Booking.constants';\nimport { L10N } from './Booking.l10n';\nimport * as style from './Booking.module.css';\nimport Skeleton from './Booking.skeleton';\nimport { Hotelverse } from './components';\nimport { Information, Menu, Modal } from './partials';\nimport { BookingPayment } from './partials/Booking.Payment';\nimport { BookingDetails, BookingSummary, BookingTerms, Footer } from '../__shared__';\nimport { Header } from '../Header';\nimport { trace } from '../helpers';\n\nconst Booking = ({ skeleton, ...others }) => {\n const { isDesktop, isMobile } = useDevice();\n const { locale, translate } = useLocale();\n const {\n value: {\n hotel: { url } = {},\n urlParams: { code: token, reservationCode: id, hasToTracking: tracking, ...urlParams } = {},\n },\n } = useStore();\n\n const [action, setAction] = useState();\n const [dataSource, setDataSource] = useState();\n const [expanded, setExpanded] = useState(false);\n const [responseError, setResponseError] = useState();\n\n useEffect(() => {\n if (skeleton || !id || !token) return;\n\n (async () => {\n setDataSource(\n await ServiceBooking.get({ id, locale, token, tracking, url }).catch((error) => setResponseError(error)),\n );\n setAction();\n })();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id, locale]);\n\n useEffect(() => {\n if (!dataSource) return;\n\n dataSource.tracking && trace({ ...dataSource.tracking, chainId: urlParams.idchain });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dataSource?.state]);\n\n const handleMenuPress = (action) => {\n if (action === ACTION.PRINT) {\n setExpanded(true);\n setTimeout(window.print, 10);\n } else {\n setAction(action);\n }\n };\n\n const handleBackHome = () => {\n const { payload: { hotelUrl } = {} } = responseError;\n\n window.location = hotelUrl || window.location.origin;\n };\n\n const { payment, state } = dataSource || {};\n const response = dataSource !== undefined;\n const isCancelled = state === STATE.CANCELLED;\n\n return (\n <>\n <Header />\n\n <View role=\"booking\" testId={others.testId} className={styles(style.container, others.className)}>\n <Progress indeterminate visible={!response && !responseError} className={style.progress} />\n {response ? (\n <>\n <View row={isDesktop} className={style.content}>\n <View>\n {state !== STATE.POS_ERROR && (\n <Notification\n error={isCancelled}\n info={state === STATE.COMPLETED}\n small={isMobile}\n success={state === STATE.CONFIRMED}\n warning={state === STATE.POSTPONED}\n wide\n >\n {translate(L10N.NOTIFICATION[state])}\n <Hotelverse {...dataSource} />\n </Notification>\n )}\n\n {payment && !isCancelled && <BookingPayment {...{ dataSource, onError: setResponseError }} />}\n\n <BookingSummary\n box={!isDesktop}\n dataSource={{ ...dataSource, showBasePrice: true }}\n className={styles(isDesktop && style.print)}\n />\n\n <Information dataSource={dataSource} />\n <BookingDetails {...{ dataSource, expanded }} expanded={isMobile} className={style.box} />\n <BookingTerms dataSource={dataSource} small />\n </View>\n\n <View className={style.side}>\n {isDesktop && (\n <BookingSummary box dataSource={{ ...dataSource, showBasePrice: true }} className={style.noPrint} />\n )}\n\n <Menu dataSource={dataSource} onPress={handleMenuPress} />\n </View>\n </View>\n\n <Modal\n {...{ action, dataSource: { ...dataSource, token } }}\n onChange={({ response: { tracking } = {}, state }) =>\n state && setDataSource({ ...dataSource, tracking, state })\n }\n onClose={() => setAction()}\n />\n </>\n ) : responseError ? (\n <Notification error large className={style.error}>\n {translate(L10N.NOTIFICATION_ERROR[responseError.code] || L10N.NOTIFICATION_ERROR[ERROR.GENERIC])}\n <Action paragraph underline wide onPress={handleBackHome}>\n {translate(L10N.ACTION_BACK_HOME)}\n </Action>\n </Notification>\n ) : (\n <Skeleton />\n )}\n </View>\n\n <Footer />\n </>\n );\n};\n\nBooking.displayName = 'Mirai:Core:Booking';\n\nBooking.propTypes = {\n skeleton: PropTypes.bool,\n};\n\nexport { Booking };\n"],"mappings":"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"}
|