From f225e54473afa9429de33291aa90323e201d95b7 Mon Sep 17 00:00:00 2001 From: superstar54 Date: Wed, 10 Jul 2024 09:23:34 +0200 Subject: [PATCH 1/4] add visual comparison test --- .github/workflows/ci.yaml | 6 ++++ .../web/frontend/package-lock.json | 33 ++++++++----------- aiida_workgraph/web/frontend/package.json | 2 +- tests/web/test_frontend.py | 12 ++----- 4 files changed, 24 insertions(+), 29 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f5503391..b41db642 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -137,3 +137,9 @@ jobs: with: token: ${{ secrets.CODECOV_TOKEN }} flags: python-${{ matrix.python-version }} + + - uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} + with: + name: playwright-traces + path: test-results/ diff --git a/aiida_workgraph/web/frontend/package-lock.json b/aiida_workgraph/web/frontend/package-lock.json index ee482d59..7069afc5 100644 --- a/aiida_workgraph/web/frontend/package-lock.json +++ b/aiida_workgraph/web/frontend/package-lock.json @@ -49,7 +49,7 @@ "three": "^0.156.1", "typescript": "^4.9.5", "vis-timeline": "^7.7.3", - "weas": "^0.1.6", + "weas": "^0.1.11", "web-vitals": "^2.1.4", "web-worker": "^1.2.0" }, @@ -5144,8 +5144,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "optional": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -5160,9 +5158,7 @@ "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "optional": true, - "peer": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/ajv-keywords": { "version": "3.5.2", @@ -19095,9 +19091,9 @@ } }, "node_modules/weas": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/weas/-/weas-0.1.6.tgz", - "integrity": "sha512-IbqwhE6JEZbIwfWQhxnp/BqKJ4pVCRvQwqwwht9Cy4fq8oguoWzngwQsYgCXZ1uB5ZrdEx8n8uFgWKtYPZD7pA==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/weas/-/weas-0.1.11.tgz", + "integrity": "sha512-iRUb84RXbl7toQjRBVWBseK1ZDBQPtUdj+maw+VLzllHxWPGz2EbaopDSHaijeetWAdoR+5V+oSJLqKey2mlNQ==", "dependencies": { "dat.gui": "^0.7.9", "three": "^0.160.1" @@ -23621,13 +23617,14 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "requires": {}, + "requires": { + "ajv": "^8.0.0" + }, "dependencies": { "ajv": { - "version": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "optional": true, - "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -23638,9 +23635,7 @@ "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "optional": true, - "peer": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" } } }, @@ -33539,9 +33534,9 @@ } }, "weas": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/weas/-/weas-0.1.6.tgz", - "integrity": "sha512-IbqwhE6JEZbIwfWQhxnp/BqKJ4pVCRvQwqwwht9Cy4fq8oguoWzngwQsYgCXZ1uB5ZrdEx8n8uFgWKtYPZD7pA==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/weas/-/weas-0.1.11.tgz", + "integrity": "sha512-iRUb84RXbl7toQjRBVWBseK1ZDBQPtUdj+maw+VLzllHxWPGz2EbaopDSHaijeetWAdoR+5V+oSJLqKey2mlNQ==", "requires": { "dat.gui": "^0.7.9", "three": "^0.160.1" diff --git a/aiida_workgraph/web/frontend/package.json b/aiida_workgraph/web/frontend/package.json index 6607055e..fba47921 100644 --- a/aiida_workgraph/web/frontend/package.json +++ b/aiida_workgraph/web/frontend/package.json @@ -44,7 +44,7 @@ "three": "^0.156.1", "typescript": "^4.9.5", "vis-timeline": "^7.7.3", - "weas": "^0.1.6", + "weas": "^0.1.11", "web-vitals": "^2.1.4", "web-worker": "^1.2.0" }, diff --git a/tests/web/test_frontend.py b/tests/web/test_frontend.py index 56406877..b44a0057 100644 --- a/tests/web/test_frontend.py +++ b/tests/web/test_frontend.py @@ -27,7 +27,6 @@ def test_workgraph(page, wg_calcfunction): # Verify the presence of the search input assert page.locator(".search-input").is_visible() - # Verify the presence of the table header columns # Verify the presence of the table header columns assert page.locator("th:has-text('PK')").is_visible() assert page.locator("th:has-text('Created')").is_visible() @@ -43,7 +42,7 @@ def test_workgraph(page, wg_calcfunction): assert page.locator("tr").count() >= 2 # Including header row -def test_workgraph_item(page, wg_calcfunction): +def test_workgraph_item(page, wg_calcfunction, assert_snapshot): wg = wg_calcfunction wg.submit(wait=True) @@ -53,13 +52,8 @@ def test_workgraph_item(page, wg_calcfunction): page.get_by_text("sumdiff3").is_visible() # Simulate user interaction (e.g., clicking a button) - # Replace the selector with the actual selector of the button you want to click - # You should identify the button that triggers an action in your component page.get_by_role("button", name="Arrange").click() page.wait_for_timeout(8000) - # Capture a screenshot - screenshot = page.screenshot() - # Save the screenshot to a file - with open("screenshot.png", "wb") as f: - f.write(screenshot) + # compare the screenshot + assert_snapshot(page.screenshot(), "screenshot.png") From 68e9f427a465d7d4f0d3a3264ea944716907604b Mon Sep 17 00:00:00 2001 From: superstar54 Date: Wed, 10 Jul 2024 09:45:44 +0200 Subject: [PATCH 2/4] add `pytest-playwright-snapshot` --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index a83e23c1..f2bb33a0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,6 +61,7 @@ tests = [ "pytest~=7.0", "pytest-cov~=2.7,<2.11", "playwright", + "pytest-playwright-snapshot", "httpx", ] From e421fed3504bf6525dc7c04f5b92d0866a9fa862 Mon Sep 17 00:00:00 2001 From: superstar54 Date: Wed, 10 Jul 2024 10:26:49 +0200 Subject: [PATCH 3/4] update screenshot --- pyproject.toml | 2 +- .../test_workgraph_item[chromium][linux].png | Bin 0 -> 40828 bytes tests/web/test_frontend.py | 15 +++++++-------- 3 files changed, 8 insertions(+), 9 deletions(-) create mode 100644 tests/web/snapshots/test_frontend/test_workgraph_item/test_workgraph_item[chromium][linux].png diff --git a/pyproject.toml b/pyproject.toml index f2bb33a0..93e75175 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,7 +61,7 @@ tests = [ "pytest~=7.0", "pytest-cov~=2.7,<2.11", "playwright", - "pytest-playwright-snapshot", + "pytest-playwright-visual", "httpx", ] diff --git a/tests/web/snapshots/test_frontend/test_workgraph_item/test_workgraph_item[chromium][linux].png b/tests/web/snapshots/test_frontend/test_workgraph_item/test_workgraph_item[chromium][linux].png new file mode 100644 index 0000000000000000000000000000000000000000..6aa322520335a359b2e8e20b3ebd0ad7ea6faa49 GIT binary patch literal 40828 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 literal 0 HcmV?d00001 diff --git a/tests/web/test_frontend.py b/tests/web/test_frontend.py index b44a0057..d83c18af 100644 --- a/tests/web/test_frontend.py +++ b/tests/web/test_frontend.py @@ -46,14 +46,13 @@ def test_workgraph_item(page, wg_calcfunction, assert_snapshot): wg = wg_calcfunction wg.submit(wait=True) - page.goto("http://localhost:8000/workgraph/{}".format(wg.pk)) - page.wait_for_timeout(8000) - - page.get_by_text("sumdiff3").is_visible() - - # Simulate user interaction (e.g., clicking a button) + page.goto( + "http://localhost:8000/workgraph/{}".format(wg.pk), + wait_until="domcontentloaded", + ) + page.wait_for_timeout(3000) page.get_by_role("button", name="Arrange").click() - page.wait_for_timeout(8000) + page.wait_for_timeout(5000) # compare the screenshot - assert_snapshot(page.screenshot(), "screenshot.png") + assert_snapshot(page.screenshot()) From 02d1af892e4cb32c09c3d02db7633555b3f4a1fb Mon Sep 17 00:00:00 2001 From: superstar54 Date: Wed, 10 Jul 2024 10:49:05 +0200 Subject: [PATCH 4/4] fix upload artifact --- .github/workflows/ci.yaml | 2 +- tests/web/test_frontend.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b41db642..62cda012 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -142,4 +142,4 @@ jobs: if: ${{ !cancelled() }} with: name: playwright-traces - path: test-results/ + path: tests/web/snapshots/ diff --git a/tests/web/test_frontend.py b/tests/web/test_frontend.py index d83c18af..c51cff46 100644 --- a/tests/web/test_frontend.py +++ b/tests/web/test_frontend.py @@ -56,3 +56,7 @@ def test_workgraph_item(page, wg_calcfunction, assert_snapshot): # compare the screenshot assert_snapshot(page.screenshot()) + + # page.get_by_text("sumdiff2").click() + # page.wait_for_timeout(3000) + # assert_snapshot(page.screenshot(), name='test_workgraph_item_sumdiff2.png')