Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

購入フロー(ゲスト)のE2Eテストを追加 #521

Merged
merged 2 commits into from
Mar 16, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 131 additions & 0 deletions e2e-tests/test/front_guest/shopping.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
import { test, expect, chromium, Page, request, APIRequestContext } from '@playwright/test';
import PlaywrightConfig from '../../../playwright.config';
import * as faker from 'faker/locale/ja';
import * as fakerEN from 'faker/locale/en_US';
import { addYears } from 'date-fns';

import { ZapClient, Mode, ContextType } from '../../utils/ZapClient';
const zapClient = new ZapClient();


const url = '/products/list.php?category_id=3';

test.describe.serial('購入フロー(ゲスト)のテストをします', () => {
let page: Page;
let mailcatcher: APIRequestContext;
test.beforeAll(async () => {
await zapClient.setMode(Mode.Protect);
await zapClient.newSession('/zap/wrk/sessions/front_guest_shopping', true);
await zapClient.importContext(ContextType.FrontGuest);

const browser = await chromium.launch();
mailcatcher = await request.newContext({
baseURL: 'http://mailcatcher:1080',
proxy: PlaywrightConfig.use.proxy
});
await mailcatcher.delete('/messages');

page = await browser.newPage();
await page.goto(url);
});

test('商品一覧を表示します', async () => {
await expect(page.locator('form[name=product_form1] >> h3')).toContainText('アイスクリーム');
});

test('商品をカートに入れます', async () => {
await page.selectOption('form[name=product_form1] >> select[name=classcategory_id1]', { label: '抹茶' });
await page.selectOption('form[name=product_form1] >> select[name=classcategory_id2]', { label: 'S' });
await page.fill('form[name=product_form1] >> input[name=quantity]', '2');
await page.click('form[name=product_form1] >> [alt=カゴに入れる]');
});

test('カートの内容を確認します', async () => {
await expect(page.locator('h2.title')).toContainText('現在のカゴの中');
await expect(page.locator('table[summary=商品情報] >> tr >> nth=1')).toContainText('アイスクリーム');
await page.click('[alt=購入手続きへ]');
});

test('購入手続きへ進みます', async () => {
await expect(page).toHaveTitle(/ログイン/);
await page.click('[alt=購入手続きへ]');
});

let email: string;
test('お客様情報を入力します', async () => {
await page.fill('input[name=order_name01]', faker.name.lastName());
await page.fill('input[name=order_name02]', faker.name.firstName());
await page.fill('input[name=order_kana01]', 'イシ');
await page.fill('input[name=order_kana02]', 'キュウブ');
await page.fill('input[name=order_company_name]', faker.company.companyName());
await page.fill('input[name=order_zip01]', faker.address.zipCode('###'));
await page.fill('input[name=order_zip02]', faker.address.zipCode('####'));
await page.selectOption('select[name=order_pref]', { label: faker.address.state() });
await page.fill('input[name=order_addr01]', faker.address.city());
await page.fill('input[name=order_addr02]', faker.address.streetName());
await page.fill('input[name=order_tel01]', faker.phone.phoneNumber('###'));
await page.fill('input[name=order_tel02]', faker.phone.phoneNumber('###'));
await page.fill('input[name=order_tel03]', faker.phone.phoneNumber('###'));
await page.fill('input[name=order_fax01]', faker.phone.phoneNumber('###'));
await page.fill('input[name=order_fax02]', faker.phone.phoneNumber('###'));
await page.fill('input[name=order_fax03]', faker.phone.phoneNumber('###'));
email = fakerEN.fake(String(Date.now()) + '.{{internet.exampleEmail}}').toLowerCase();
await page.fill('input[name=order_email]', email);
await page.fill('input[name=order_email02]', email);
const sex = faker.datatype.number({ min: 1, max: 2 });
await page.check(`input[name=order_sex][value="${sex}"]`);
const job = faker.datatype.number({ min: 1, max: 18 });
await page.selectOption('select[name=order_job]', { value: String(job) });
const birth = faker.date.past(20, addYears(new Date(), -20));
await page.selectOption('select[name=order_year]', String(birth.getFullYear()));
await page.selectOption('select[name=order_month]', String(birth.getMonth() + 1));
await page.selectOption('select[name=order_day]', String(birth.getDate()));

await page.click('text=お届け先を指定');
await page.fill('input[name=shipping_name01]', faker.name.lastName());
await page.fill('input[name=shipping_name02]', faker.name.firstName());
await page.fill('input[name=shipping_kana01]', 'イシ');
await page.fill('input[name=shipping_kana02]', 'キュウブ');
await page.fill('input[name=shipping_company_name]', faker.company.companyName());
await page.fill('input[name=shipping_zip01]', faker.address.zipCode('###'));
await page.fill('input[name=shipping_zip02]', faker.address.zipCode('####'));
await page.selectOption('select[name=shipping_pref]', { label: faker.address.state() });
await page.fill('input[name=shipping_addr01]', faker.address.city());
await page.fill('input[name=shipping_addr02]', faker.address.streetName());
await page.fill('input[name=shipping_tel01]', faker.phone.phoneNumber('###'));
await page.fill('input[name=shipping_tel02]', faker.phone.phoneNumber('###'));
await page.fill('input[name=shipping_tel03]', faker.phone.phoneNumber('###'));
await page.fill('input[name=shipping_fax01]', faker.phone.phoneNumber('###'));
await page.fill('input[name=shipping_fax02]', faker.phone.phoneNumber('###'));
await page.fill('input[name=shipping_fax03]', faker.phone.phoneNumber('###'));

await page.click('[alt=上記のお届け先のみに送る]');
});

test('お支払い方法・お届け時間の指定をします', async () => {
await page.pause();
await page.click('text=代金引換');
await page.selectOption('select[name=deliv_date1]', { index: 2 });
await page.selectOption('select[name=deliv_time_id1]', { label: '午後' });
await page.fill('textarea[name=message]', 'お問い合わせ');
await page.click('[alt=次へ]');
});

test('入力内容の確認をします', async () => {
await expect(page.locator('h2.title')).toContainText('入力内容のご確認');
await page.click('[alt=ご注文完了ページへ]');
});

test('注文完了を確認します', async () => {
await expect(page.locator('h2.title')).toContainText('ご注文完了');

const messages = await mailcatcher.get('/messages');
await expect((await messages.json()).length).toBe(1);
await expect(await messages.json()).toContainEqual(expect.objectContaining(
{
subject: expect.stringContaining('ご注文ありがとうございます'),
recipients: expect.arrayContaining([ `<${email}>` ])
}
));
});
});