From d85d1d11b796e4d7f0300ea1add20796e37b0fc5 Mon Sep 17 00:00:00 2001 From: Shaiah Emigh-Doyle Date: Tue, 14 Jan 2025 15:14:14 -0500 Subject: [PATCH] implement a simple test for columns and sheets in the data file. --- .../shipped_data/test_RENEWAL_GUIDANCE.py | 47 ++++++++++++++++++ ...NEWAL_GUIDANCE-2024-01-14--2025-01-14.xlsx | Bin 0 -> 13903 bytes 2 files changed, 47 insertions(+) create mode 100644 metrics_utility/test/shipped_data/test_RENEWAL_GUIDANCE.py create mode 100644 shipped_data/billing/reports/2025/01/RENEWAL_GUIDANCE-2024-01-14--2025-01-14.xlsx diff --git a/metrics_utility/test/shipped_data/test_RENEWAL_GUIDANCE.py b/metrics_utility/test/shipped_data/test_RENEWAL_GUIDANCE.py new file mode 100644 index 0000000..85d1781 --- /dev/null +++ b/metrics_utility/test/shipped_data/test_RENEWAL_GUIDANCE.py @@ -0,0 +1,47 @@ +import pandas as pd +import pytest + +file_path = "/awx_devel/awx-dev/metrics-utility/shipped_data/billing/reports/2025/01/RENEWAL_GUIDANCE-2024-01-14--2025-01-14.xlsx" + + +EXPECTED_SHEETS = { + "Usage Reporting": ['Renewal guidance', 'Unnamed: 1', 'Unnamed: 2', 'Updated: Jan 14, 2025'], + "Managed nodes": [ + 'Host name', 'First\nautomation', 'Last\nautomation', 'Number of\nAutomations', + 'Number of days\nbetween first_automation\nand last_automation', 'Number of\nDeletions', + 'Last\ndeleted', 'HostMetric\nrecord count', 'HostMetric active\nrecord count', + 'HostMetric deleted\nrecord count', 'Host names', 'Variables ansible_host', + 'Serial Numbers', 'Machine UUIDs' + ], + "Managed nodes ephemeral": [ + 'Host name', 'First\nautomation', 'Last\nautomation', 'Number of\nAutomations', + 'Number of days\nbetween first_automation\nand last_automation', 'Number of\nDeletions', + 'Last\ndeleted', 'HostMetric\nrecord count', 'HostMetric active\nrecord count', + 'HostMetric deleted\nrecord count', 'Host names', 'Variables ansible_host', + 'Serial Numbers', 'Machine UUIDs' + ], + "Managed nodes ephemeral usage": [ + 'Start of the\nephemeral window', 'End of the\nephemeral window', 'Ephemeral automated hosts' + ], + "Deleted Managed nodes": [ + 'Host name', 'First\nautomation', 'Last\nautomation', 'Number of\nAutomations', + 'Number of days\nbetween first_automation\nand last_automation', 'Number of\nDeletions', + 'Last\ndeleted', 'HostMetric\nrecord count', 'HostMetric active\nrecord count', + 'HostMetric deleted\nrecord count', 'Host names', 'Variables ansible_host', + 'Serial Numbers', 'Machine UUIDs' + ] +} + +@pytest.mark.parametrize("sheet_name, expected_columns", EXPECTED_SHEETS.items()) +def test_sheet_columns(sheet_name, expected_columns): + """Test the column names for each sheet.""" + + df = pd.read_excel(file_path, sheet_name=sheet_name) + + assert df.columns.tolist() == expected_columns, f"Column names do not match for sheet: {sheet_name}" + + +def test_sheet_tab_names(): + """Test the sheet names in the Excel file.""" + excel_data = pd.ExcelFile(file_path) + assert excel_data.sheet_names == list(EXPECTED_SHEETS.keys()), "Sheet names do not match." diff --git a/shipped_data/billing/reports/2025/01/RENEWAL_GUIDANCE-2024-01-14--2025-01-14.xlsx b/shipped_data/billing/reports/2025/01/RENEWAL_GUIDANCE-2024-01-14--2025-01-14.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..70c2007894ffecf7ad2e531927433d0ec79f697a GIT binary patch literal 13903 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 literal 0 HcmV?d00001