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テストの拡充 #1149

Draft
wants to merge 57 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
975c624
front_guest/entry.test.ts のリファクタリング
nanasess Jan 17, 2025
07927d8
mypage_login.fixture で毎回会員登録するよう修正
nanasess Jan 17, 2025
c3421d2
スクリーンショットを撮る場合は全画面で撮る
nanasess Jan 20, 2025
8c474c4
ポイントを加算するよう修正
nanasess Jan 20, 2025
1745266
ご注文完了時のメールチェック修正
nanasess Jan 20, 2025
d387af9
Merge remote-tracking branch 'upstream/master' into add-e2e-tests-dev
nanasess Jan 20, 2025
2c2f737
別のお届け先を設定するテスト追加
nanasess Jan 20, 2025
0fe9fe5
front_login/shopping.test.ts のリファクタリング
nanasess Jan 20, 2025
2cb5429
複数配送の E2E テストを追加
nanasess Jan 21, 2025
c7a0d00
コミット漏れ
nanasess Jan 21, 2025
747bbc2
front_guest/shopping.test.ts のリファクタリング
nanasess Jan 21, 2025
7eaf146
Add front_guest/shopping_multiple.test
nanasess Jan 21, 2025
22be6b7
お届け先が反映されるのを待つ
nanasess Jan 22, 2025
a3cd81e
会員登録内容変更のテスト
nanasess Jan 22, 2025
55190b4
注文履歴のテスト追加
nanasess Jan 22, 2025
730f059
お気に入り登録のテスト追加
nanasess Jan 22, 2025
723429d
別のお届け先登録のテストを追加
nanasess Jan 23, 2025
ac09123
退会手続きのテスト追加
nanasess Jan 23, 2025
833a274
SHOPマスターのテスト追加
nanasess Jan 23, 2025
b682f3e
特定商取引法のページのテストを追加
nanasess Jan 24, 2025
037e9f2
配送方法設定のテスト追加
nanasess Jan 24, 2025
11eb236
支払方法設定のテスト追加
nanasess Jan 27, 2025
ffc84d1
ポイント設定のテストを追加
nanasess Jan 27, 2025
2eebf3f
ダミー画像を追加
nanasess Jan 28, 2025
d758d22
メール設定のテストを追加
nanasess Jan 28, 2025
81471ab
会員規約設定のテストを追加
nanasess Jan 29, 2025
cc12ff0
税率設定のテストを追加
nanasess Jan 30, 2025
993e195
商品登録のテスト追加
nanasess Jan 31, 2025
848d362
お気に入り登録判定の修正
nanasess Feb 3, 2025
ae2cfdc
関連商品登録を追加
nanasess Feb 3, 2025
bed5487
税率設定が反映されないためコメントアウト
nanasess Feb 3, 2025
61cf934
Fixture のディレクトリを移動
nanasess Feb 4, 2025
6e9a361
product.test.ts のリファクタリング
nanasess Feb 4, 2025
1e0082a
商品マスターのテスト追加
nanasess Feb 4, 2025
e1aa575
商品編集のテストを追加
nanasess Feb 4, 2025
2c48cd5
商品確認のテストを追加
nanasess Feb 4, 2025
42a3c34
Remove
nanasess Feb 4, 2025
bfebfa5
商品削除のテストを追加
nanasess Feb 4, 2025
e99f1f4
商品複製のテストを追加
nanasess Feb 4, 2025
6b90d75
商品規格登録のテスト追加
nanasess Feb 4, 2025
e112960
商品CSVダウンロードのテスト追加
nanasess Feb 5, 2025
5fe864d
商品登録CSVのテスト追加
nanasess Feb 5, 2025
ed1a6db
規格管理のテストを追加
nanasess Feb 5, 2025
ae95a41
Apply yarn eslint --fix --ext .ts e2e-tests
nanasess Feb 6, 2025
ef94c84
use eslint-plugin-playwright
nanasess Feb 6, 2025
6560a1c
Apply eslint-plugin-playwright
nanasess Feb 6, 2025
42b7c93
eslint のエラーを修正
nanasess Feb 6, 2025
603a94d
eslint-plugin-playwright のエラー修正
nanasess Feb 6, 2025
bc369bc
カテゴリ登録画面のテスト追加
nanasess Feb 10, 2025
6d4fdb7
ESLint のルールを eccube.js に合わせて最新化
nanasess Feb 12, 2025
1aa850e
Apply eslint --fix
nanasess Feb 12, 2025
e18005a
カテゴリCSVダウンロードのテストを追加
nanasess Feb 13, 2025
ff39ea3
カテゴリCSVアップロードのテストを追加
nanasess Feb 13, 2025
6f5d72a
test: add e2e test for admin product maker settings
nanasess Feb 13, 2025
295eb98
test: add e2e tests for product ranking in admin panel
nanasess Feb 13, 2025
b66aa17
レビュー管理のテストを追加
nanasess Feb 14, 2025
1c18275
feat(tests): add new category CSV file for testing
nanasess Feb 20, 2025
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
9 changes: 7 additions & 2 deletions .eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,24 @@
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"plugin:playwright/recommended",
"jquery"
],
"rules": {
"@typescript-eslint/no-var-requires": "off",
"camelcase": "off",
"space-in-parens": "off",
"array-bracket-spacing": ["error", "never"],
"template-curly-spacing": ["error", "never"],
"computed-property-spacing": ["error", "never"],
"comma-dangle": "off",
"quotes": "off",
"no-shadow-restricted-names": "off",
"no-prototype-builtins": "off",
"max-len": ["warn", {"code": 120}],
"space-before-function-paren": ["error", {
"anonymous": "never",
"named": "never",
"anonymous": "always",
"named": "always",
"asyncArrow": "always"
}]
}
Expand Down
10 changes: 10 additions & 0 deletions data/eccube.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import $ from "jquery";

import "jquery-migrate";

/* 警告を無効にする */
$.migrateMute = true;

Expand Down Expand Up @@ -35,6 +36,7 @@ import "slick-carousel/slick/slick-theme.css";
*/

(function (window, undefined) {

// 名前空間の重複を防ぐ
if (window.eccube === undefined) {
window.eccube = {};
Expand Down Expand Up @@ -128,6 +130,7 @@ import "slick-carousel/slick/slick-theme.css";
// 郵便番号から検索した住所を渡す.
eccube.putAddress = function (input1, input2, state, city, town) {
if (state !== "") {

// 項目に値を入力する.
document.form1[input1].selectedIndex = state;
document.form1[input2].value = city + town;
Expand Down Expand Up @@ -373,11 +376,13 @@ import "slick-carousel/slick/slick-theme.css";
for (let i = 0; i < len; i++) {
if (document.form1[list[i]]) {
if (color === "") {

// 有効にする。
document.form1[list[i]].removeAttribute("disabled");
document.form1[list[i]].style.backgroundColor =
eccube.savedColor[list[i]];
} else {

// 無効にする。
document.form1[list[i]].setAttribute("disabled", "disabled");
eccube.savedColor[list[i]] =
Expand Down Expand Up @@ -425,6 +430,7 @@ import "slick-carousel/slick/slick-theme.css";

// 親ウィンドウのページを変更する.
eccube.changeParentUrl = function (url) {

// 親ウィンドウの存在確認
if (eccube.isOpener()) {
window.opener.location.href = url;
Expand Down Expand Up @@ -468,6 +474,7 @@ import "slick-carousel/slick/slick-theme.css";
if ($sele1 && $sele1.length) {
const classcat_id1 = $sele1.val() ? $sele1.val() : "";
if ($sele2 && $sele2.length) {

// 規格2の選択肢をクリア
$sele2.children().remove();

Expand All @@ -477,6 +484,7 @@ import "slick-carousel/slick/slick-theme.css";
if (eccube.hasOwnProperty("productsClassCategories")) {
classcat2 = eccube.productsClassCategories[product_id][classcat_id1];
} else {

// 詳細表示時
classcat2 = eccube.classCategories[classcat_id1];
}
Expand Down Expand Up @@ -520,6 +528,7 @@ import "slick-carousel/slick/slick-theme.css";
`#${classcat_id2}`
];
} else {

// 詳細表示時
classcat2 = eccube.classCategories[classcat_id1][`#${classcat_id2}`];
}
Expand Down Expand Up @@ -612,6 +621,7 @@ import "slick-carousel/slick/slick-theme.css";
* Initialize.
*/
$(() => {

// 規格1選択時
$("select[name=classcategory_id1]").on("change", function () {
const $form = $(this).parents("form");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { test as base, expect } from "@playwright/test";
import { AdminLoginPage } from "../pages/admin/login.page";
import { Mode, ContextType } from '../utils/ZapClient';
import { ECCUBE_ADMIN_USER, ECCUBE_ADMIN_PASS, ADMIN_DIR } from "../config/default.config";
import PlaywrightConfig from '../../playwright.config';
import { AdminLoginPage } from "../../pages/admin/login.page";
import { Mode, ContextType } from '../../utils/ZapClient';
import { ECCUBE_ADMIN_USER, ECCUBE_ADMIN_PASS, ADMIN_DIR } from "../../config/default.config";
import PlaywrightConfig from '../../../playwright.config';

type AdminLoginFixtures = {
adminLoginPage: AdminLoginPage;
Expand All @@ -12,7 +12,7 @@ export const test = base.extend<AdminLoginFixtures>({
adminLoginPage: async ({ page }, use) => {
const loginPage = new AdminLoginPage(page);
if (PlaywrightConfig.use?.proxy === undefined) {
await page.goto(`/${ ADMIN_DIR }`);
await page.goto(`/${ADMIN_DIR}`);
await loginPage.login(ECCUBE_ADMIN_USER, ECCUBE_ADMIN_PASS);
} else {
const zapClient = loginPage.getZapClient();
Expand All @@ -24,7 +24,7 @@ export const test = base.extend<AdminLoginFixtures>({
await zapClient.setForcedUserModeEnabled();
expect(await zapClient.isForcedUserModeEnabled()).toBeTruthy();
}
await page.goto(`/${ ADMIN_DIR }home.php`);
await page.goto(`/${ADMIN_DIR}home.php`);
}
await use(loginPage);
}
Expand Down
22 changes: 22 additions & 0 deletions e2e-tests/fixtures/admin/register_product.fixture.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { test as base } from "./admin_login.fixture";
import { AdminProductsProductPage } from "../../pages/admin/products/product.page";

type RegisterProductFixtures = {
adminProductsProductPage: AdminProductsProductPage;
};

export const test = base.extend<RegisterProductFixtures>({
// eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars
adminProductsProductPage: async ({ adminLoginPage, page }, use) => {
const productPage = new AdminProductsProductPage(page);
await productPage.goto();
await productPage.fill();
await productPage.fillSubComments();
await productPage.fillRecommends();
await productPage.gotoConfirm();
await productPage.register();
use(productPage);
}
});

export { expect } from "@playwright/test";
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import { test as base } from '../fixtures/mypage_login.fixture';
import PlaywrightConfig from '../../playwright.config';
import { ProductsDetailPage } from '../pages/products/detail.page';
import { CartPage } from '../pages/cart.page';
import { test as base } from './mypage_login.fixture';
import PlaywrightConfig from '../../../playwright.config';
import { ProductsDetailPage } from '../../pages/products/detail.page';
import { CartPage } from '../../pages/cart.page';

type CartLoginFixtures = {
cartLoginPage: CartPage;
};

/** 商品をカートに入れて購入手続きへ進むフィクスチャ. */
export const test = base.extend<CartLoginFixtures>({
// eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars
cartLoginPage: async ({ mypageLoginPage, page }, use) => {
await page.goto(PlaywrightConfig.use?.baseURL ?? "/"); // トップへ遷移しないと、スキャン後にカートが空になってしまう
const productsDetailPage = new ProductsDetailPage(page);
Expand Down
60 changes: 60 additions & 0 deletions e2e-tests/fixtures/front_login/mypage_login.fixture.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { test as base, expect } from "@playwright/test";
import { MypageLoginPage } from "../../pages/mypage/login.page";
import { EntryPage } from "../../pages/entry/entry.page";
import { AdminLoginPage } from "../../pages/admin/login.page";
import { Mode, ContextType } from '../../utils/ZapClient';
import PlaywrightConfig from '../../../playwright.config';
import { ECCUBE_ADMIN_USER, ECCUBE_ADMIN_PASS, ADMIN_DIR } from "../../config/default.config";
import { faker } from '@faker-js/faker/locale/ja';
import { FakerUtils } from "../../utils/FakerUtils";

type MypageLoginFixtures = {
mypageLoginPage: MypageLoginPage;
};

export const test = base.extend<MypageLoginFixtures>({
mypageLoginPage: async ({ page }, use) => {
const email = FakerUtils.createEmail();
const password = FakerUtils.createPassword();
const loginPage = new MypageLoginPage(page, email, password);
if (PlaywrightConfig.use?.proxy === undefined) {
const entryPage = new EntryPage(page, email, password);
await entryPage.goto();
await entryPage.agree();
await entryPage.fill();
await entryPage.confirm();
await entryPage.register();
await loginPage.goto();
await loginPage.logout();

// 購入フローのテストでポイント利用するため、ポイントを加算する
const adminLoginPage = new AdminLoginPage(page);
await page.goto(`/${ADMIN_DIR}`);
await adminLoginPage.login(ECCUBE_ADMIN_USER, ECCUBE_ADMIN_PASS);
await page.goto(`/${ADMIN_DIR}/customer/index.php`);
await page.locator('input[name=search_email]').fill(email);
await page.getByRole('link', { name: 'この条件で検索する' }).click();
await page.getByRole('link', { name: '編集' }).click();
await page.getByRole('row', { name: '所持ポイント' }).getByRole('textbox').fill(String(faker.number.int({ min: 0, max: 999999 })));
await page.getByRole('link', { name: '確認ページへ' }).click();
await page.getByRole('link', { name: 'この内容で登録する' }).click();

await page.goto(`/`);
await loginPage.login();
} else {
const zapClient = loginPage.getZapClient();
await zapClient.setMode(Mode.Protect);
await zapClient.newSession('/zap/wrk/sessions/front_login', true);
await zapClient.importContext(ContextType.FrontLogin);

if (!await zapClient.isForcedUserModeEnabled()) {
await zapClient.setForcedUserModeEnabled();
expect(await zapClient.isForcedUserModeEnabled()).toBeTruthy();
}
await page.goto(`/mypage/index.php`);
}
use(loginPage);
}
});

export { expect } from "@playwright/test";
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test as base } from './cartin.fixture';
import { CartPage } from '../pages/cart.page';
import { CartPage } from '../../pages/cart.page';

type ShoppingDelivLoginFixtures = {
shoppingDelivLoginPage: CartPage;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { test as base } from './shopping_deliv.fixture';
import { ShoppingPaymentPage } from '../pages/shopping/payment.page';
import { ShoppingPaymentPage } from '../../pages/shopping/payment.page';

type ShoppingPaymentLoginFixtures = {
shoppingPaymentLoginPage: ShoppingPaymentPage;
};

export const test = base.extend<ShoppingPaymentLoginFixtures>({
// eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars
shoppingPaymentLoginPage: async ({ shoppingDelivLoginPage, page }, use) => {
const paymentPage = new ShoppingPaymentPage(page);
await paymentPage.goto();
Expand Down
Binary file added e2e-tests/fixtures/images/main.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
33 changes: 0 additions & 33 deletions e2e-tests/fixtures/mypage_login.fixture.ts

This file was deleted.

14 changes: 7 additions & 7 deletions e2e-tests/pages/admin/login.page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,31 +11,31 @@ export class AdminLoginPage {
readonly loginButton: Locator;
zapClient: ZapClient;

constructor(page: Page) {
constructor (page: Page) {
this.page = page;
this.url = `/${ ADMIN_DIR }index.php`;
this.url = `/${ADMIN_DIR}index.php`;

this.loginId = page.locator('input[name=login_id]');
this.password = page.locator('input[name=password]');
this.loginButton = page.getByRole('link', { name: 'LOGIN' });
this.zapClient = new ZapClient();
}

async goto() {
async goto () {
await this.page.goto(this.url);
}

async login(loginId: string, password: string) {
async login (loginId: string, password: string) {
await this.loginId.fill(loginId);
await this.password.fill(password);
await this.loginButton.click();
}

async logout() {
await this.page.goto(`/${ ADMIN_DIR }/logout.php`);
async logout () {
await this.page.goto(`/${ADMIN_DIR}/logout.php`);
}

getZapClient() {
getZapClient () {
return this.zapClient;
}
}
Loading
Loading