Skip to content

Commit 8f1b395

Browse files
authored
アップデート通知のe2eテスト (#1716)
* e2eテスト追加 * バグフィックス
1 parent f17eb8e commit 8f1b395

File tree

4 files changed

+89
-2
lines changed

4 files changed

+89
-2
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ npm run test-watch:browser-e2e -- --headed # テスト中の UI を表示
105105
```
106106

107107
Playwright を使用しているためテストパターンを生成することもできます。
108-
ブラウザ版を起動している状態で以下のコマンドを実行してください
108+
**ブラウザ版を起動している状態で**以下のコマンドを実行してください
109109

110110
```bash
111111
npx playwright codegen http://localhost:5173/#/home --viewport-size=800,600

src/type/utility.ts

+9
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,12 @@ export type IsEqual<X, Y> = (<T>() => T extends X ? 1 : 2) extends <
44
>() => T extends Y ? 1 : 2
55
? true
66
: false;
7+
8+
// undefinedかnullでないことを保証する
9+
export function assertNonNullable<T>(
10+
value: T
11+
): asserts value is NonNullable<T> {
12+
if (value == undefined) {
13+
throw new Error("Value is null or undefined");
14+
}
15+
}

src/views/EditorHome.vue

+6-1
Original file line numberDiff line numberDiff line change
@@ -856,7 +856,12 @@ const isAcceptRetrieveTelemetryDialogOpenComputed = computed({
856856
857857
// アップデート通知
858858
const isUpdateNotificationDialogOpenComputed = computed({
859-
get: () => store.state.isUpdateNotificationDialogOpen,
859+
get: () =>
860+
!store.state.isAcceptTermsDialogOpen &&
861+
!store.state.isCharacterOrderDialogOpen &&
862+
!store.state.isDefaultStyleSelectDialogOpen &&
863+
!store.state.isAcceptRetrieveTelemetryDialogOpen &&
864+
store.state.isUpdateNotificationDialogOpen,
860865
set: (val) =>
861866
store.dispatch("SET_DIALOG_OPEN", {
862867
isUpdateNotificationDialogOpen: val,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import { test, expect } from "@playwright/test";
2+
import dotenv from "dotenv";
3+
import semver from "semver";
4+
import { navigateToMain, gotoHome } from "../navigators";
5+
import { getNewestQuasarDialog } from "../locators";
6+
import { UpdateInfo } from "@/type/preload";
7+
import { assertNonNullable } from "@/type/utility";
8+
9+
// アップデート通知が出る環境にする
10+
test.beforeEach(async ({ page }) => {
11+
dotenv.config();
12+
13+
// 動作環境より新しいバージョン
14+
const latestVersion = semver.inc(
15+
process.env.VITE_APP_VERSION ?? process.env.npm_package_version ?? "0.0.0",
16+
"major"
17+
);
18+
assertNonNullable(latestVersion);
19+
20+
// アップデート情報を返すAPIのモック
21+
if (process.env.VITE_LATEST_UPDATE_INFOS_URL == undefined) {
22+
throw new Error("VITE_LATEST_UPDATE_INFOS_URL is not defined");
23+
}
24+
page.route(process.env.VITE_LATEST_UPDATE_INFOS_URL, (route) => {
25+
const updateInfos: UpdateInfo[] = [
26+
{
27+
version: latestVersion,
28+
descriptions: [],
29+
contributors: [],
30+
},
31+
];
32+
route.fulfill({
33+
status: 200,
34+
body: JSON.stringify(updateInfos),
35+
});
36+
});
37+
});
38+
39+
test.beforeEach(async ({ page }) => {
40+
await gotoHome({ page });
41+
42+
await navigateToMain(page);
43+
await page.waitForTimeout(100);
44+
});
45+
46+
test("アップデートが通知されたりスキップしたりできる", async ({ page }) => {
47+
await page.waitForTimeout(500);
48+
49+
// 通知されている
50+
const dialog = getNewestQuasarDialog(page);
51+
await expect(dialog.getByText("アップデートのお知らせ")).toBeVisible();
52+
53+
// 普通に閉じると消える
54+
await dialog.getByRole("button", { name: "閉じる" }).click();
55+
await page.waitForTimeout(500);
56+
await expect(dialog).not.toBeVisible();
57+
58+
// 再度開くとまた表示される
59+
await page.reload();
60+
await expect(dialog.getByText("アップデートのお知らせ")).toBeVisible();
61+
62+
// スキップすると消える
63+
await dialog
64+
.getByRole("button", { name: "このバージョンをスキップ" })
65+
.click();
66+
await page.waitForTimeout(500);
67+
await expect(dialog).not.toBeVisible();
68+
69+
// 再度開いても表示されない(スキップされた)
70+
await page.reload();
71+
await page.waitForTimeout(5000); // エンジン読み込み待機
72+
await expect(dialog).not.toBeVisible();
73+
});

0 commit comments

Comments
 (0)