| import io |
| from unittest.mock import patch |
|
|
| import pandas as pd |
| import pytest |
|
|
| from queries.process_ciq_2g import _read_ciq_df |
| from queries.process_ciq_3g import read_ciq_3g_brut |
| from queries.verify_ciq import read_ciq_file |
| from utils.ciq_excel import read_ciq_excel, select_ciq_sheet_name |
|
|
|
|
| class DummyExcelFile: |
| def __init__(self, sheet_names): |
| self.sheet_names = sheet_names |
|
|
|
|
| def test_select_ciq_sheet_name_uses_single_sheet_without_name_check(): |
| fake_file = io.BytesIO(b"dummy") |
|
|
| with patch("utils.ciq_excel.pd.ExcelFile", return_value=DummyExcelFile(["Feuil1"])): |
| assert select_ciq_sheet_name(fake_file, technology="2g") == "Feuil1" |
|
|
|
|
| def test_select_ciq_sheet_name_detects_exact_multi_sheet_match(): |
| fake_file = io.BytesIO(b"dummy") |
|
|
| with patch( |
| "utils.ciq_excel.pd.ExcelFile", |
| return_value=DummyExcelFile(["2G", "3G", "4G"]), |
| ): |
| assert select_ciq_sheet_name(fake_file, technology="3g") == "3G" |
|
|
|
|
| def test_select_ciq_sheet_name_detects_suffix_based_match(): |
| fake_file = io.BytesIO(b"dummy") |
|
|
| with patch( |
| "utils.ciq_excel.pd.ExcelFile", |
| return_value=DummyExcelFile(["Summary", "6525_SKS_PITIANGOMA_2G", "Notes"]), |
| ): |
| assert ( |
| select_ciq_sheet_name(fake_file, technology="2g") |
| == "6525_SKS_PITIANGOMA_2G" |
| ) |
|
|
|
|
| def test_select_ciq_sheet_name_raises_when_no_matching_sheet_exists(): |
| fake_file = io.BytesIO(b"dummy") |
|
|
| with patch( |
| "utils.ciq_excel.pd.ExcelFile", |
| return_value=DummyExcelFile(["Summary", "Notes"]), |
| ): |
| with pytest.raises(ValueError, match="Unable to detect the 2G sheet"): |
| select_ciq_sheet_name(fake_file, technology="2g") |
|
|
|
|
| def test_read_ciq_excel_uses_user_selected_sheet_when_provided(): |
| fake_file = io.BytesIO(b"dummy") |
|
|
| with patch( |
| "utils.ciq_excel.pd.ExcelFile", |
| return_value=DummyExcelFile(["2G", "Manual"]), |
| ), patch("utils.ciq_excel.pd.read_excel") as mock_read_excel: |
| mock_read_excel.return_value = pd.DataFrame({"Sites": ["SITE"]}) |
|
|
| read_ciq_excel(fake_file, technology="2g", sheet_name="Manual") |
|
|
| assert mock_read_excel.call_args.kwargs["sheet_name"] == "Manual" |
|
|
|
|
| def test_read_ciq_excel_raises_when_user_selected_sheet_is_missing(): |
| fake_file = io.BytesIO(b"dummy") |
|
|
| with patch( |
| "utils.ciq_excel.pd.ExcelFile", |
| return_value=DummyExcelFile(["2G", "3G"]), |
| ): |
| with pytest.raises(ValueError, match="Sheet '4G' does not exist"): |
| read_ciq_excel(fake_file, technology="2g", sheet_name="4G") |
|
|
|
|
| def test_read_ciq_2g_df_reads_detected_2g_sheet(): |
| fake_file = io.BytesIO(b"dummy") |
|
|
| with patch( |
| "utils.ciq_excel.pd.ExcelFile", |
| return_value=DummyExcelFile(["3G", "6525_SKS_SIEME_2G", "4G"]), |
| ), patch("utils.ciq_excel.pd.read_excel") as mock_read_excel: |
| mock_read_excel.return_value = pd.DataFrame( |
| { |
| "Sites": ["6525_SKS_SIEME_2G"], |
| "NOM_CELLULE": ["6525_SKS_SIEME_1_900"], |
| } |
| ) |
|
|
| df = _read_ciq_df(fake_file) |
|
|
| assert mock_read_excel.call_args.kwargs["sheet_name"] == "6525_SKS_SIEME_2G" |
| assert df.iloc[0]["Sites"] == "6525_SKS_SIEME_2G" |
|
|
|
|
| def test_read_ciq_2g_df_reads_user_selected_sheet(): |
| fake_file = io.BytesIO(b"dummy") |
|
|
| with patch( |
| "utils.ciq_excel.pd.ExcelFile", |
| return_value=DummyExcelFile(["2G", "Manual_2G"]), |
| ), patch("utils.ciq_excel.pd.read_excel") as mock_read_excel: |
| mock_read_excel.return_value = pd.DataFrame( |
| {"Sites": ["SITE_2G"], "NOM_CELLULE": ["SITE_2G_1_900"]} |
| ) |
|
|
| _read_ciq_df(fake_file, ciq_sheet_name="Manual_2G") |
|
|
| assert mock_read_excel.call_args.kwargs["sheet_name"] == "Manual_2G" |
|
|
|
|
| def test_read_ciq_3g_brut_reads_detected_3g_sheet(): |
| fake_file = io.BytesIO(b"dummy") |
|
|
| with patch( |
| "utils.ciq_excel.pd.ExcelFile", |
| return_value=DummyExcelFile(["2G", "3G", "4G"]), |
| ), patch("utils.ciq_excel.pd.read_excel") as mock_read_excel: |
| mock_read_excel.return_value = pd.DataFrame({"Sites": ["SITE_3G"]}) |
|
|
| df = read_ciq_3g_brut(fake_file) |
|
|
| assert mock_read_excel.call_args.kwargs["sheet_name"] == "3G" |
| assert df.iloc[0]["Sites"] == "SITE_3G" |
|
|
|
|
| def test_verify_read_ciq_file_reads_detected_4g_sheet(): |
| fake_file = io.BytesIO(b"dummy") |
|
|
| with patch( |
| "utils.ciq_excel.pd.ExcelFile", |
| return_value=DummyExcelFile(["2G", "3G", "4G"]), |
| ), patch("utils.ciq_excel.pd.read_excel") as mock_read_excel: |
| mock_read_excel.return_value = pd.DataFrame({"CellName": ["SITE_4G"]}) |
|
|
| df = read_ciq_file(fake_file, technology="4g") |
|
|
| assert mock_read_excel.call_args.kwargs["sheet_name"] == "4G" |
| assert df.iloc[0]["CellName"] == "SITE_4G" |
|
|
|
|
| def test_verify_read_ciq_file_reads_user_selected_sheet(): |
| fake_file = io.BytesIO(b"dummy") |
|
|
| with patch( |
| "utils.ciq_excel.pd.ExcelFile", |
| return_value=DummyExcelFile(["4G", "LTE_BACKUP"]), |
| ), patch("utils.ciq_excel.pd.read_excel") as mock_read_excel: |
| mock_read_excel.return_value = pd.DataFrame({"CellName": ["SITE_4G"]}) |
|
|
| read_ciq_file(fake_file, technology="4g", ciq_sheet_name="LTE_BACKUP") |
|
|
| assert mock_read_excel.call_args.kwargs["sheet_name"] == "LTE_BACKUP" |