@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.
Files changed (43) hide show
  1. package/__tests__/Booking/__mocks__/booking-delete.json +1 -0
  2. package/__tests__/Booking/__mocks__/booking-get.json +105 -0
  3. package/__tests__/Booking/booking.constants.js +8 -0
  4. package/__tests__/Booking/workflows/cancel.workflow.js +20 -0
  5. package/__tests__/Booking/workflows/index.js +5 -0
  6. package/__tests__/Booking/workflows/openMobileMenu.workflow.js +4 -0
  7. package/__tests__/Booking/workflows/print.workflow.js +13 -0
  8. package/__tests__/Booking/workflows/resend.workflow.js +18 -0
  9. package/__tests__/Booking/workflows/review.workflow.js +17 -0
  10. package/__tests__/Checkout/workflows/form.workflow.js +1 -1
  11. package/__tests__/Checkout/workflows/review.workflow.js +1 -1
  12. package/__tests__/Session/workflows/bookings.workflow.js +3 -3
  13. package/__tests__/Session/workflows/logout.workflow.js +3 -3
  14. package/__tests__/Session/workflows/profile.workflow.js +3 -3
  15. package/__tests__/Signup/workflows/index.js +1 -0
  16. package/__tests__/Signup/workflows/signup.workflow.js +3 -3
  17. package/__tests__/Signup/workflows/signupError.workflow.js +22 -0
  18. package/__tests__/booking.spec.jsx +34 -0
  19. package/__tests__/{bookingQuery/bookingQuey._spec.js → bookingQuey._spec.js} +1 -2
  20. package/__tests__/{Checkout/checkout.spec.jsx → checkout.spec.jsx} +6 -4
  21. package/__tests__/constants.js +3 -1
  22. package/__tests__/{Finder/finder.spec.js → finder.spec.js} +14 -13
  23. package/__tests__/{Rates/rates.spec.jsx → rates.spec.jsx} +1 -1
  24. package/__tests__/session.spec.js +32 -0
  25. package/__tests__/{Signup/signup.spec.js → signup.spec.js} +8 -4
  26. package/build/components/Booking/Booking.js +1 -0
  27. package/build/components/Booking/Booking.js.map +1 -1
  28. package/build/components/Booking/partials/Booking.Menu.js +4 -2
  29. package/build/components/Booking/partials/Booking.Menu.js.map +1 -1
  30. package/build/components/Booking/partials/Booking.Modal.js +4 -2
  31. package/build/components/Booking/partials/Booking.Modal.js.map +1 -1
  32. package/build/components/Booking/partials/__tests__/__snapshots__/Booking.Menu.test.js.snap +20 -0
  33. package/build/components/Booking/partials/__tests__/__snapshots__/Booking.Modal.test.js.snap +8 -0
  34. package/build/components/Session/Session.Account.js +2 -3
  35. package/build/components/Session/Session.Account.js.map +1 -1
  36. package/build/components/Session/__tests__/__snapshots__/Session.test.js.snap +2 -2
  37. package/build/components/__shared__/ButtonPayment/components/FormSipay/__tests__/__snapshots__/FormSipay.test.js.snap +6 -6
  38. package/build/components/__shared__/Occupation/__tests__/__snapshots__/Occupation.test.js.snap +4 -4
  39. package/build/helpers/sanitizeComponent.js +1 -0
  40. package/build/helpers/sanitizeComponent.js.map +1 -1
  41. package/package.json +2 -2
  42. package/public/index.html +6 -1
  43. 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,5 @@
1
+ export * from './cancel.workflow';
2
+ export * from './openMobileMenu.workflow';
3
+ export * from './print.workflow';
4
+ export * from './resend.workflow';
5
+ export * from './review.workflow';
@@ -0,0 +1,4 @@
1
+ export const openMobileMenu = async ({ page }) => {
2
+ await page.getByTestId('show-booking-menu').click();
3
+ await page.waitForTimeout(500);
4
+ };
@@ -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,4 +1,4 @@
1
- const { expect } = require('@playwright/test');
1
+ import { expect } from '@playwright/test';
2
2
 
3
3
  export const review = async ({ page }) => {
4
4
  // Expand more info
@@ -1,8 +1,8 @@
1
1
  import { expect } from '@playwright/test';
2
2
 
3
- export const bookings = async ({ page }) => {
4
- await page.getByTestId('show-session-menu').click();
5
- await page.getByTestId('session-bookings').click();
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-session-menu').click();
5
- await page.getByTestId('session-logout').click();
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-session-menu').click();
10
- await page.getByTestId('session-profile').click();
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
 
@@ -1 +1,2 @@
1
1
  export * from './signup.workflow';
2
+ export * from './signupError.workflow';
@@ -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"]', USER.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(409);
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,5 +1,4 @@
1
- // @ts-check
2
- const { test, expect } = require('@playwright/test');
1
+ import { test, expect } from '@playwright/test';
3
2
 
4
3
  const BOOKING_QUERY = 'bookingQuery';
5
4
  const CORRECT_ID = '23011372299';
@@ -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(require(`./__mocks__/checkout-${method}${method === 'post' ? `-${payment}` : ''}.json`)),
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(`Checkout w/ ${paymentId}`, async ({ page }) => {
29
+ test(`Payment w/ ${paymentId}`, async ({ page }) => {
28
30
  await enviroment({ page, payment: paymentId });
29
31
 
30
32
  await form({ page });
@@ -1,3 +1,5 @@
1
+ const DEFAULT_TIMEOUT = 10000;
2
+
1
3
  const SESSION = {
2
4
  email: 'hello@soyjavi.com',
3
5
  password: 'BuyB1tc01N',
@@ -15,4 +17,4 @@ const USER = {
15
17
  password: 'BuyB1tc01N',
16
18
  };
17
19
 
18
- export { SESSION, USER };
20
+ export { DEFAULT_TIMEOUT, SESSION, USER };
@@ -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
- await page.goto('http://local.mirai.com:8080', { waitUntil: 'networkidle', timeout: 20000 });
9
+
10
+ await page.goto('http://local.mirai.com:8080', { waitUntil: 'networkidle', timeout: 10000 });
10
11
  });
11
12
 
12
- test('Finder basic search', async ({ page }) => {
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: 15000 });
17
+ await expect(page).toHaveURL(/.*step1-rates/, { timeout: 10000 });
17
18
  });
18
19
 
19
- test('Finder search with adult added', async ({ isMobile, page }) => {
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: 15000 });
26
+ await expect(page).toHaveURL(/.*step1-rates/, { timeout: 10000 });
26
27
  });
27
28
 
28
- test('Finder search with child added', async ({ isMobile, page }) => {
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: 15000 });
35
+ await expect(page).toHaveURL(/.*step1-rates/, { timeout: 10000 });
35
36
  });
36
37
 
37
- test('Finder search with child added and not age', async ({ isMobile, page }) => {
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('Finder search with promocode', async ({ isMobile, page }) => {
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: 15000 });
54
+ await expect(page).toHaveURL(/.*step1-rates/, { timeout: 10000 });
54
55
  });
55
56
 
56
- test('Finder search with adult added and promocode', async ({ isMobile, page }) => {
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: 20000 });
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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"}