From 6006217d10714cc29642a95ef259bdb2c337736d Mon Sep 17 00:00:00 2001 From: Ishwarya Date: Fri, 27 Feb 2026 16:44:31 +0530 Subject: [PATCH 1/7] Mobile Repack Tests --- beam/tests/mobile/test_repack.py | 284 +++++++++++++++++++++++++++++++ 1 file changed, 284 insertions(+) create mode 100644 beam/tests/mobile/test_repack.py diff --git a/beam/tests/mobile/test_repack.py b/beam/tests/mobile/test_repack.py new file mode 100644 index 00000000..59ea668a --- /dev/null +++ b/beam/tests/mobile/test_repack.py @@ -0,0 +1,284 @@ +# Copyright (c) 2024, AgriTheory and contributors +# For license information, please see license.txt + +import re +import frappe +import pytest +from playwright.sync_api import expect + +from beam.tests.test_utils import use_current_db_transaction + + +def fill_warehouse_dropdown(page, label: str, value: str): + wrapper = page.locator(".input-wrapper", has=page.locator("label", has_text=label)) + inp = wrapper.locator("input") + inp.click() + inp.fill(value) + page.wait_for_timeout(300) + result = wrapper.locator("li.autocomplete-result", has_text=value).first + result.wait_for(state="visible") + result.click() + + +@pytest.fixture(autouse=True, scope="session") +def disable_handling_unit_for_tests(): + """Disable handling unit validation for all items during tests.""" + items = frappe.get_all("Item", filters={"enable_handling_unit": 1}, pluck="name") + for item in items: + frappe.db.set_value("Item", item, "enable_handling_unit", 0) + frappe.db.commit() + yield + for item in items: + frappe.db.set_value("Item", item, "enable_handling_unit", 1) + frappe.db.commit() + + +@pytest.mark.order(8) +def test_repack_items_manually(page): + page.get_by_text("Repack").click() + expect(page).to_have_url(re.compile(r"#/repack"), timeout=15000) + + with use_current_db_transaction(): + source_barcode = frappe.get_all( + "Item Barcode", + filters={"parent": "Butter"}, + pluck="barcode", + limit=1, + ) + assert source_barcode, "Butter must have a barcode" + + finished_barcode = frappe.get_all( + "Item Barcode", + filters={"parent": "Ambrosia Pie"}, + pluck="barcode", + limit=1, + ) + assert finished_barcode, "Ambrosia Pie must have a barcode" + + source_wh = "Refrigerator - APC" + target_wh = "Baked Goods - APC" + + with page.expect_request( + lambda request: request.headers.get("x-frappe-cmd") == "beam.beam.scan.scan" + ): + page.evaluate("barcode => scanner.simulate(window, barcode)", source_barcode[0]) + + page.wait_for_timeout(800) + + page.get_by_role("button", name="+").click() + fill_warehouse_dropdown(page, "Source Warehouse", source_wh) + page.get_by_role("button", name="ADD", exact=True).click() + + expect(page.locator("css=.beam_list-item").first).to_be_visible() + + with page.expect_request( + lambda request: request.headers.get("x-frappe-cmd") == "beam.beam.scan.scan" + ): + page.evaluate("barcode => scanner.simulate(window, barcode)", finished_barcode[0]) + + page.wait_for_timeout(800) + + page.get_by_role("button", name="+").click() + fill_warehouse_dropdown(page, "Target Warehouse", target_wh) + page.get_by_role("button", name="ADD", exact=True).click() + + expect(page.locator("css=.beam_list-item").nth(1)).to_be_visible() + + page.get_by_role("button", name="SAVE", exact=True).click() + page.wait_for_timeout(1500) + + with use_current_db_transaction(): + entries = frappe.get_all( + "Stock Entry", + filters={"stock_entry_type": "Repack", "docstatus": 0}, + fields=["name"], + order_by="creation desc", + limit=1, + ) + assert entries, "Expected draft Stock Entry to be created" + stock_entry_name = entries[0]["name"] + + page.get_by_role("button", name="REPACK", exact=True).click() + page.wait_for_timeout(1500) + + with use_current_db_transaction(): + submitted = frappe.get_all( + "Stock Entry", + filters={"name": stock_entry_name, "docstatus": 1}, + fields=["name"], + ) + + assert submitted, f"Expected Stock Entry {stock_entry_name} to be submitted" + + +@pytest.mark.order(9) +def test_repack_using_bom(page): + page.get_by_text("Repack").click() + page.wait_for_load_state("networkidle") + assert "/repack" in page.url + + with use_current_db_transaction(): + boms = frappe.get_all( + "BOM", + filters={"is_active": 1, "is_default": 1, "docstatus": 1}, + pluck="name", + limit=1, + ) + assert boms, "No active default BOM found in test data" + bom_name = boms[0] + + warehouse = frappe.get_all( + "Warehouse", + filters={"is_group": 0, "company": "Ambrosia Pie Company"}, + pluck="name", + limit=1, + )[0] + + fill_warehouse_dropdown(page, "BOM (Optional)", bom_name) + page.wait_for_timeout(1000) + + expect(page.locator("css=.beam_list-item").first).to_be_visible() + + fill_warehouse_dropdown(page, "Target Warehouse", warehouse) + + page.get_by_role("button", name="SAVE", exact=True).click() + page.wait_for_timeout(1500) + + with use_current_db_transaction(): + entries = frappe.get_all( + "Stock Entry", + filters={"stock_entry_type": "Repack", "docstatus": 0}, + fields=["name"], + order_by="creation desc", + limit=1, + ) + assert entries, "Expected a draft Stock Entry to be created from BOM repack" + + +@pytest.mark.order(10) +def test_scan_item_for_repack(page): + page.get_by_text("Repack").click() + page.wait_for_load_state("networkidle") + assert "/repack" in page.url + + with use_current_db_transaction(): + item_barcodes = frappe.get_all( + "Item Barcode", + filters={"parenttype": "Item"}, + fields=["parent", "barcode"], + limit=1, + ) + assert item_barcodes, "No Item barcodes found in test data" + item_code = item_barcodes[0]["parent"] + barcode = item_barcodes[0]["barcode"] + + with page.expect_request( + lambda request: request.headers.get("x-frappe-cmd") == "beam.beam.scan.scan" + ): + page.evaluate("barcode => scanner.simulate(window, barcode)", barcode) + page.wait_for_timeout(800) + + item_wrapper = page.locator( + ".input-wrapper", has=page.locator("label", has_text="Item to Repack") + ) + expect(item_wrapper.locator("input")).to_have_value(item_code) + + qty_input = page.locator("input.aform_input-field[type='number']") + expect(qty_input).to_have_value("1") + + with page.expect_request( + lambda request: request.headers.get("x-frappe-cmd") == "beam.beam.scan.scan" + ): + page.evaluate("barcode => scanner.simulate(window, barcode)", barcode) + page.wait_for_timeout(800) + + expect(qty_input).to_have_value("2") + + +@pytest.mark.order(11) +def test_clear_repack_form(page): + page.get_by_text("Repack").click() + page.wait_for_load_state("networkidle") + assert "/repack" in page.url + + with use_current_db_transaction(): + item_barcodes = frappe.get_all( + "Item Barcode", + filters={"parenttype": "Item"}, + fields=["parent", "barcode"], + limit=1, + ) + assert item_barcodes, "No Item barcodes found in test data" + barcode = item_barcodes[0]["barcode"] + + warehouse = frappe.get_all( + "Warehouse", + filters={"is_group": 0, "company": "Ambrosia Pie Company"}, + pluck="name", + limit=1, + )[0] + + with page.expect_request( + lambda request: request.headers.get("x-frappe-cmd") == "beam.beam.scan.scan" + ): + page.evaluate("barcode => scanner.simulate(window, barcode)", barcode) + page.wait_for_timeout(800) + + page.get_by_role("button", name="+").click() + fill_warehouse_dropdown(page, "Source Warehouse", warehouse) + + page.get_by_role("button", name="ADD", exact=True).click() + page.wait_for_timeout(500) + + expect(page.locator("css=.beam_list-item").first).to_be_visible() + expect(page.get_by_role("button", name="CLEAN", exact=True)).to_be_visible() + + page.get_by_role("button", name="CLEAN", exact=True).click() + page.wait_for_timeout(500) + + expect(page.get_by_text("Scan Items, Select Warehouses, and Set Qty to Begin")).to_be_visible() + + expect(page.get_by_role("button", name="CLEAN", exact=True)).to_be_hidden() + + +@pytest.mark.order(12) +def test_repack_validation_single_warehouse_direction(page): + page.get_by_text("Repack").click() + page.wait_for_load_state("networkidle") + assert "/repack" in page.url + + with use_current_db_transaction(): + item_barcodes = frappe.get_all( + "Item Barcode", + filters={"parenttype": "Item"}, + fields=["parent", "barcode"], + limit=1, + ) + assert item_barcodes, "No Item barcodes found in test data" + barcode = item_barcodes[0]["barcode"] + + warehouses = frappe.get_all( + "Warehouse", + filters={"is_group": 0, "company": "Ambrosia Pie Company"}, + pluck="name", + limit=2, + ) + assert len(warehouses) >= 2, "Need at least 2 warehouses for this test" + + with page.expect_request( + lambda request: request.headers.get("x-frappe-cmd") == "beam.beam.scan.scan" + ): + page.evaluate("barcode => scanner.simulate(window, barcode)", barcode) + page.wait_for_timeout(800) + + page.get_by_role("button", name="+").click() + + fill_warehouse_dropdown(page, "Source Warehouse", warehouses[0]) + fill_warehouse_dropdown(page, "Target Warehouse", warehouses[1]) + + page.get_by_role("button", name="ADD", exact=True).click() + page.wait_for_timeout(500) + + expect(page.get_by_text("Please select only source or target warehouse")).to_be_visible() + + expect(page.get_by_text("Scan Items, Select Warehouses, and Set Qty to Begin")).to_be_visible() \ No newline at end of file From f23e9080820fddd9858188dd1e7de20561f776ed Mon Sep 17 00:00:00 2001 From: Ishwarya Date: Fri, 27 Feb 2026 16:52:29 +0530 Subject: [PATCH 2/7] Fixed pytest fail --- .pre-commit-config.yaml | 2 +- beam/tests/fixtures.py | 2 +- beam/tests/mobile/test_repack.py | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index de282cf5..6b01c6ff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -55,7 +55,7 @@ repos: - tomli - repo: https://github.com/agritheory/test_utils - rev: v1.0.0 + rev: v1.20.0 hooks: - id: update_pre_commit_config - id: validate_copyright diff --git a/beam/tests/fixtures.py b/beam/tests/fixtures.py index bf60c591..c13906d7 100644 --- a/beam/tests/fixtures.py +++ b/beam/tests/fixtures.py @@ -715,7 +715,7 @@ }, "phone": "(704) 885-0542", "roles": ["Stock Manager", "Item Manager"], - "department": "Management", + "department": "Operations", "designation": "Bakery Manager", }, { diff --git a/beam/tests/mobile/test_repack.py b/beam/tests/mobile/test_repack.py index 59ea668a..575bdacd 100644 --- a/beam/tests/mobile/test_repack.py +++ b/beam/tests/mobile/test_repack.py @@ -2,6 +2,7 @@ # For license information, please see license.txt import re + import frappe import pytest from playwright.sync_api import expect @@ -281,4 +282,4 @@ def test_repack_validation_single_warehouse_direction(page): expect(page.get_by_text("Please select only source or target warehouse")).to_be_visible() - expect(page.get_by_text("Scan Items, Select Warehouses, and Set Qty to Begin")).to_be_visible() \ No newline at end of file + expect(page.get_by_text("Scan Items, Select Warehouses, and Set Qty to Begin")).to_be_visible() From 7846ec47e3fc22ea99340c9b6c9cb7427b9ed1c1 Mon Sep 17 00:00:00 2001 From: Ishwarya Date: Fri, 27 Feb 2026 18:29:23 +0530 Subject: [PATCH 3/7] Commented the departmen field value --- beam/tests/fixtures.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/beam/tests/fixtures.py b/beam/tests/fixtures.py index c13906d7..cf1e3e46 100644 --- a/beam/tests/fixtures.py +++ b/beam/tests/fixtures.py @@ -715,7 +715,7 @@ }, "phone": "(704) 885-0542", "roles": ["Stock Manager", "Item Manager"], - "department": "Operations", + # "department": "Operations", "designation": "Bakery Manager", }, { @@ -732,7 +732,7 @@ "phone": "(658) 583-5499", "roles": ["Stock User", "BEAM Mobile User"], "reports_to": "Tristan Hawkins", - "department": "Operations", + # "department": "Operations", "designation": "Baker", }, { @@ -749,7 +749,7 @@ "phone": "(962) 762-5895", "roles": ["Stock User", "BEAM Mobile User"], "reports_to": "Tristan Hawkins", - "department": "Operations", + # "department": "Operations", "designation": "Baker", }, { @@ -766,7 +766,7 @@ "phone": "(366) 357-8223", "roles": ["Stock User", "BEAM Mobile User"], "reports_to": "Tristan Hawkins", - "department": "Operations", + # "department": "Operations", "designation": "Bakery Manager", }, { @@ -783,7 +783,7 @@ "phone": "(930) 920-4520", "roles": ["Stock User", "BEAM Mobile User"], "reports_to": "Tristan Hawkins", - "department": "Operations", + # "department": "Operations", "designation": "Baker", }, { @@ -800,7 +800,7 @@ "phone": "(054) 893-8970", "roles": ["Stock User", "BEAM Mobile User"], "reports_to": "Tristan Hawkins", - "department": "Operations", + # "department": "Operations", "designation": "Baker", }, { @@ -817,7 +817,7 @@ "phone": "(814) 677-9322", "roles": ["Stock User", "BEAM Mobile User"], "reports_to": "Tristan Hawkins", - "department": "Operations", + # "department": "Operations", "designation": "Baker", }, { @@ -834,7 +834,7 @@ "phone": "(133) 195-7828", "roles": ["Stock User", "BEAM Mobile User"], "reports_to": "Tristan Hawkins", - "department": "Operations", + # "department": "Operations", "designation": "Baker", }, { @@ -851,7 +851,7 @@ "phone": "(041) 000-2569", "roles": ["Stock User", "BEAM Mobile User"], "reports_to": "Tristan Hawkins", - "department": "Operations", + # "department": "Operations", "designation": "Baker", }, ] From 80ebc750b810a819cc0f92a513f566b8ac5e13eb Mon Sep 17 00:00:00 2001 From: Ishwarya Date: Mon, 2 Mar 2026 12:21:58 +0530 Subject: [PATCH 4/7] Corrected the bom test --- beam/tests/mobile/test_repack.py | 35 ++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/beam/tests/mobile/test_repack.py b/beam/tests/mobile/test_repack.py index 575bdacd..266d5612 100644 --- a/beam/tests/mobile/test_repack.py +++ b/beam/tests/mobile/test_repack.py @@ -111,36 +111,41 @@ def test_repack_items_manually(page): assert submitted, f"Expected Stock Entry {stock_entry_name} to be submitted" - @pytest.mark.order(9) def test_repack_using_bom(page): page.get_by_text("Repack").click() page.wait_for_load_state("networkidle") assert "/repack" in page.url + bom_name = "BOM-Gooseberry Pie Filling-001" + target_wh = "Refrigerator - APC" + with use_current_db_transaction(): - boms = frappe.get_all( - "BOM", - filters={"is_active": 1, "is_default": 1, "docstatus": 1}, - pluck="name", + finished_barcode = frappe.get_all( + "Item Barcode", + filters={"parent": "Gooseberry Pie"}, + pluck="barcode", limit=1, ) - assert boms, "No active default BOM found in test data" - bom_name = boms[0] + assert finished_barcode, "Gooseberry Pie must have a barcode" - warehouse = frappe.get_all( - "Warehouse", - filters={"is_group": 0, "company": "Ambrosia Pie Company"}, - pluck="name", - limit=1, - )[0] + with page.expect_request( + lambda request: request.headers.get("x-frappe-cmd") == "beam.beam.scan.scan" + ): + page.evaluate("barcode => scanner.simulate(window, barcode)", finished_barcode[0]) + + page.wait_for_timeout(800) + + page.get_by_role("button", name="+").click() + page.wait_for_timeout(300) fill_warehouse_dropdown(page, "BOM (Optional)", bom_name) page.wait_for_timeout(1000) - expect(page.locator("css=.beam_list-item").first).to_be_visible() + fill_warehouse_dropdown(page, "Target Warehouse", target_wh) - fill_warehouse_dropdown(page, "Target Warehouse", warehouse) + page.get_by_role("button", name="ADD", exact=True).click() + page.wait_for_timeout(1000) page.get_by_role("button", name="SAVE", exact=True).click() page.wait_for_timeout(1500) From 793efc276d878d2e4d0f4d69d5647b38b10ff5cb Mon Sep 17 00:00:00 2001 From: Ishwarya Date: Mon, 2 Mar 2026 12:25:03 +0530 Subject: [PATCH 5/7] Fixed format issue --- beam/tests/mobile/test_repack.py | 1 + 1 file changed, 1 insertion(+) diff --git a/beam/tests/mobile/test_repack.py b/beam/tests/mobile/test_repack.py index 266d5612..e5909265 100644 --- a/beam/tests/mobile/test_repack.py +++ b/beam/tests/mobile/test_repack.py @@ -111,6 +111,7 @@ def test_repack_items_manually(page): assert submitted, f"Expected Stock Entry {stock_entry_name} to be submitted" + @pytest.mark.order(9) def test_repack_using_bom(page): page.get_by_text("Repack").click() From b356835ba92d25819472ab0365589f8e00e4114d Mon Sep 17 00:00:00 2001 From: Ishwarya Date: Mon, 2 Mar 2026 12:55:50 +0530 Subject: [PATCH 6/7] Added assert for quantity --- beam/tests/mobile/test_repack.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/beam/tests/mobile/test_repack.py b/beam/tests/mobile/test_repack.py index e5909265..4d144508 100644 --- a/beam/tests/mobile/test_repack.py +++ b/beam/tests/mobile/test_repack.py @@ -33,7 +33,6 @@ def disable_handling_unit_for_tests(): frappe.db.set_value("Item", item, "enable_handling_unit", 1) frappe.db.commit() - @pytest.mark.order(8) def test_repack_items_manually(page): page.get_by_text("Repack").click() @@ -59,6 +58,9 @@ def test_repack_items_manually(page): source_wh = "Refrigerator - APC" target_wh = "Baked Goods - APC" + qty_input = page.locator("input.aform_input-field[type='number']") + expect(qty_input).to_have_value("0") + with page.expect_request( lambda request: request.headers.get("x-frappe-cmd") == "beam.beam.scan.scan" ): @@ -66,7 +68,16 @@ def test_repack_items_manually(page): page.wait_for_timeout(800) + expect(qty_input).to_have_value("1") + page.get_by_role("button", name="+").click() + + expect(qty_input).to_have_value("2") + + page.get_by_role("button", name="-").click() + + expect(qty_input).to_have_value("1") + fill_warehouse_dropdown(page, "Source Warehouse", source_wh) page.get_by_role("button", name="ADD", exact=True).click() @@ -98,7 +109,7 @@ def test_repack_items_manually(page): ) assert entries, "Expected draft Stock Entry to be created" stock_entry_name = entries[0]["name"] - + page.get_by_role("button", name="REPACK", exact=True).click() page.wait_for_timeout(1500) From 9b0f1145ce434c59de7fd3e9244952bde0f879a5 Mon Sep 17 00:00:00 2001 From: Ishwarya Date: Mon, 2 Mar 2026 13:10:59 +0530 Subject: [PATCH 7/7] Fixed format issue --- .pre-commit-config.yaml | 2 +- beam/tests/mobile/test_repack.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6b01c6ff..79f3f284 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -55,7 +55,7 @@ repos: - tomli - repo: https://github.com/agritheory/test_utils - rev: v1.20.0 + rev: v1.20.1 hooks: - id: update_pre_commit_config - id: validate_copyright diff --git a/beam/tests/mobile/test_repack.py b/beam/tests/mobile/test_repack.py index 4d144508..25f66033 100644 --- a/beam/tests/mobile/test_repack.py +++ b/beam/tests/mobile/test_repack.py @@ -33,6 +33,7 @@ def disable_handling_unit_for_tests(): frappe.db.set_value("Item", item, "enable_handling_unit", 1) frappe.db.commit() + @pytest.mark.order(8) def test_repack_items_manually(page): page.get_by_text("Repack").click() @@ -109,7 +110,7 @@ def test_repack_items_manually(page): ) assert entries, "Expected draft Stock Entry to be created" stock_entry_name = entries[0]["name"] - + page.get_by_role("button", name="REPACK", exact=True).click() page.wait_for_timeout(1500)