diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml deleted file mode 100644 index 1168bd9..0000000 --- a/.github/workflows/python-app.yml +++ /dev/null @@ -1,39 +0,0 @@ -# This workflow will install Python dependencies, run tests and lint with a single version of Python -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python - -name: Python application - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -permissions: - contents: read - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: Set up Python 3.10 - uses: actions/setup-python@v3 - with: - python-version: "3.10" - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install flake8 pytest - if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - - name: Lint with flake8 - run: | - # stop the build if there are Python syntax errors or undefined names - flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics - # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide - flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - - name: Test with pytest - run: | - pytest diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml new file mode 100644 index 0000000..c71dc54 --- /dev/null +++ b/.github/workflows/python-tests.yml @@ -0,0 +1,34 @@ +name: Run Pytest + +on: + push: + branches: [ main, master ] + pull_request: + branches: [ main, master ] + +jobs: + test: + runs-on: ubuntu-latest + + strategy: + matrix: + python-version: ["3.11" ] # adjust versions you want to support + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python setup.py install + pip install pytest + + - name: Run tests with pytest + run: | + pytest --maxfail=1 --disable-warnings -v diff --git a/gen_requirements.py b/gen_requirements.py index d73fc77..2c6c87a 100644 --- a/gen_requirements.py +++ b/gen_requirements.py @@ -59,19 +59,22 @@ # Maps named DATAGEN piece (see description above) to a list of names of Python packages. Please use # alphabetical order for each package list, and do not add version constraints here! REQUIREMENTS_BY_PIECE: RequirementsByPieceType = [ - # Base requirements needed to install tvm. + # Base requirements needed to install gsm-data-generator. ( "core", ( - "Base requirements needed to install tvm", + "Base requirements needed to install gsm-data-generator", [ "cloudpickle", - # "ml_dtypes", + "docutils", "numpy", "packaging", + "pandas", "psutil", - "scipy", - "tornado", + "pycryptodome", + "pydantic", + "python-dateutil", + "pytz", "typing_extensions", ], ), @@ -107,18 +110,11 @@ # ], # ), # ), + # # ( - # "importer-tensorflow", - # ("Requirements for the TensorFlow importer", ["tensorflow", "tensorflow-estimator"]), - # ), - # ( - # "importer-tflite", - # ("Requirements for the TFLite importer", ["tensorflow", "tensorflow-estimator", "tflite"]), - # ), - # ( - # "tvmc", + # "gsm-data-generator-c", # ( - # "Requirements for the tvmc command-line tool", + # "Requirements for the gsm-data-generator-c command-line tool", # [ # "ethos-u-vela", # "future", # Hidden dependency of torch. @@ -133,18 +129,6 @@ # ], # ), # ), - # # XGBoost, useful for autotuning on some targets. - # ( - # "xgboost", - # ( - # "Requirements for XGBoost autotuning", - # [ - # "future", # Hidden dependency of torch. - # "torch", - # "xgboost", - # ], - # ), - # ), # Development requirements ( "dev", @@ -155,12 +139,15 @@ "autodocsumm", "black", "commonmark", - # "cpplint", + "dateutil", "docutils", - "image", - "matplotlib", - "pillow", + "pandas", + "pydantic", + # "image", + # "matplotlib", + # "pillow", "pylint", + "pytz", "sphinx", "sphinx_autodoc_annotation", "sphinx_gallery", @@ -171,6 +158,7 @@ ), ] + ConstraintsType = typing.List[typing.Tuple[str, typing.Union[None, str]]] # Maps a named Python package (which should appear in REQUIREMENTS_BY_PIECE above) to a @@ -186,13 +174,14 @@ # 2. If DATAGEN will functionally break against an old version of a dependency, specify a >= relation # here. Include a comment linking to context or explaining why the constraint is in place. CONSTRAINTS = [ + ("pydantic", ">=2.7"), + # ("astroid", None), # ("autodocsumm", None), # ("black", "==20.8b1"), # ("cloudpickle", None), # ("commonmark", ">=0.7.3"), # From PR #213. - # ("coremltools", None), - # ("cpplint", None), + # # ("pydantic", ">=2.7,<3"), # ( # "docutils", # "<0.17", @@ -207,7 +196,7 @@ # ("pillow", None), # ("psutil", None), # ("pylint", None), - # ("scipy", None), + # # ("scipy", None), # ("sphinx", None), # ("sphinx_autodoc_annotation", None), # ("sphinx_gallery", None), diff --git a/gsm_data_generator/executor/script_gpt.py b/gsm_data_generator/executor/script_gpt.py index 392a187..406d23a 100644 --- a/gsm_data_generator/executor/script_gpt.py +++ b/gsm_data_generator/executor/script_gpt.py @@ -107,7 +107,9 @@ def generate_opc(self, ki: str) -> str: # --------------------------- # DATAFRAME PROCESSING # --------------------------- - def apply_function(self, df: pd.DataFrame, dest: str, src: str, function) -> pd.DataFrame: + def apply_function( + self, df: pd.DataFrame, dest: str, src: str, function + ) -> pd.DataFrame: """Apply transformation function on `src` column to produce `dest` column.""" if dest in df.columns: df[dest] = df[src].apply(function) @@ -126,7 +128,9 @@ def apply_functions(self, df: pd.DataFrame) -> pd.DataFrame: df["ADM6"] = df["ADM6"].apply(lambda _: self.generate_code("ADM6", 8)) df["KI"] = df["KI"].apply(lambda _: self.data_generator.generate_ki()) - df["ACC"] = df["IMSI"].apply(lambda imsi: self.dep_data_generator.calculate_acc(imsi=str(imsi))) + df["ACC"] = df["IMSI"].apply( + lambda imsi: self.dep_data_generator.calculate_acc(imsi=str(imsi)) + ) # Apply EKI / OPC self.apply_function(df, "EKI", "KI", self.generate_eki) @@ -137,6 +141,8 @@ def apply_functions(self, df: pd.DataFrame) -> pd.DataFrame: for key in ["KIC", "KID", "KIK"]: col = f"{key}{i}" if col in df.columns: - df[col] = df["KI"].apply(lambda _: self.data_generator.generate_otas()) + df[col] = df["KI"].apply( + lambda _: self.data_generator.generate_otas() + ) return df diff --git a/gsm_data_generator/globals/settings.py b/gsm_data_generator/globals/settings.py index 5843b1d..ca6a8a5 100644 --- a/gsm_data_generator/globals/settings.py +++ b/gsm_data_generator/globals/settings.py @@ -1,159 +1,159 @@ -from PyQt6.QtCore import QSettings -from PyQt6.QtWidgets import QWidget -from .parameters import Parameters - - -class SETTINGS(QWidget): - __instance = None - - def __init__(self, ui): - """ - GET and SET settings for GUI - """ - super().__init__() - self.ui = ui - if SETTINGS.__instance is not None: - raise Exception( - "SETTINGS class is a singleton! Use get_instance() to access the instance." - ) - else: - SETTINGS.__instance = self - self.parameters = Parameters.get_instance() - self.IMSI_SETT = QSettings("IMSI", "") - self.ICCID_SETT = QSettings("ICCID", "") - self.PIN1_SETT = QSettings("PIN1", "") - self.PUK1_SETT = QSettings("PUK1", "") - self.PIN2_SETT = QSettings("PIN2", "") - self.PUK2_SETT = QSettings("PUK2", "") - self.ADM1_SETT = QSettings("ADM1", "") - self.ADM6_SETT = QSettings("ADM6", "") - self.ACC_SETT = QSettings("ACC", "") - self.K4_SETT = QSettings("K4", "") - self.OP_SETT = QSettings("OP", "") - self.DATA_SIZE_SETT = QSettings("DATA_SIZE", "") - - self.PIN1_RAND_CHECK_SETT = QSettings("PIN1_RAND", "") - self.PIN2_RAND_CHECK_SETT = QSettings("PIN2_RAND", "") - self.PUK1_RAND_CHECK_SETT = QSettings("PUK1_RAND", "") - self.PUK2_RAND_CHECK_SETT = QSettings("PUK2_RAND", "") - self.ADM1_RAND_CHECK_SETT = QSettings("ADM1_RAND", "") - self.ADM6_RAND_CHECK_SETT = QSettings("ADM6_RAND", "") - - # @staticmethod - # def get_instance(): - # if SETTINGS.__instance is None: - # SETTINGS.__instance = SETTINGS() - # return SETTINGS.__instance - - def __del__(self): - self.save_global_params_to_settings() - - @staticmethod - def BoolToValue(value: bool): - if isinstance(value, bool): - if value: - return "True" - else: - return "False" - else: - return value - - @staticmethod - def valueToBool(value: str): - if isinstance(value, str): - if value.upper() == "TRUE": - return True - else: - return False - else: - return value - - def set_gui_from_settings(self): - self.ui.imsi_text.setText(self.parameters.get_IMSI()) - self.ui.iccid_text.setText(self.parameters.get_ICCID()) - self.ui.pin1_text.setText(self.parameters.get_PIN1()) - self.ui.puk1_text.setText(self.parameters.get_PUK1()) - self.ui.pin2_text.setText(self.parameters.get_PIN2()) - self.ui.puk2_text.setText(self.parameters.get_PUK2()) - self.ui.adm1_text.setText(self.parameters.get_ADM1()) - self.ui.adm6_text.setText(self.parameters.get_ADM6()) - self.ui.k4_key_text.setText(self.parameters.get_K4()) - self.ui.op_key_text.setText(self.parameters.get_OP()) - self.ui.data_size_text.setText(self.parameters.get_DATA_SIZE()) - self.ui.pin1_rand_check.setChecked(bool(self.parameters.get_PIN1_RAND())) - self.ui.pin2_rand_check.setChecked(bool(self.parameters.get_PIN2_RAND())) - self.ui.puk1_rand_check.setChecked(bool(self.parameters.get_PUK1_RAND())) - self.ui.puk2_rand_check.setChecked(bool(self.parameters.get_PUK2_RAND())) - self.ui.adm1_rand_check.setChecked(bool(self.parameters.get_ADM1_RAND())) - self.ui.adm6_rand_check.setChecked(bool(self.parameters.get_ADM6_RAND())) - - def save_global_params_to_settings(self): - self.IMSI_SETT.setValue("IMSI", self.parameters.get_IMSI()) - self.ICCID_SETT.setValue("ICCID", self.parameters.get_ICCID()) - self.PIN1_SETT.setValue("PIN1", self.parameters.get_PIN1()) - self.PUK1_SETT.setValue("PUK1", self.parameters.get_PUK1()) - self.PIN2_SETT.setValue("PIN2", self.parameters.get_PIN2()) - self.PUK2_SETT.setValue("PUK2", self.parameters.get_PUK2()) - self.ADM1_SETT.setValue("ADM1", self.parameters.get_ADM1()) - self.ADM6_SETT.setValue("ADM6", self.parameters.get_ADM6()) - self.K4_SETT.setValue("K4", self.parameters.get_K4()) - self.OP_SETT.setValue("OP", self.parameters.get_OP()) - self.DATA_SIZE_SETT.setValue("DATA_SIZE", self.parameters.get_DATA_SIZE()) - - self.PIN1_RAND_CHECK_SETT.setValue( - "PIN1_RAND", self.BoolToValue(self.parameters.get_PIN1_RAND()) - ) - self.PIN2_RAND_CHECK_SETT.setValue( - "PIN2_RAND", self.BoolToValue(self.parameters.get_PIN2_RAND()) - ) - self.PUK1_RAND_CHECK_SETT.setValue( - "PUK1_RAND", self.BoolToValue(self.parameters.get_PUK1_RAND()) - ) - self.PUK2_RAND_CHECK_SETT.setValue( - "PUK2_RAND", self.BoolToValue(self.parameters.get_PUK2_RAND()) - ) - self.ADM1_RAND_CHECK_SETT.setValue( - "ADM1_RAND", self.BoolToValue(self.parameters.get_ADM1_RAND()) - ) - self.ADM6_RAND_CHECK_SETT.setValue( - "ADM6_RAND", self.BoolToValue(self.parameters.get_ADM6_RAND()) - ) - - def load_settings_to_global(self): - self.parameters.set_IMSI(self.IMSI_SETT.value("IMSI")) - self.parameters.set_ICCID(self.ICCID_SETT.value("ICCID")) - self.parameters.set_PIN1(self.PIN1_SETT.value("PIN1")) - self.parameters.set_PUK1(self.PUK1_SETT.value("PUK1")) - self.parameters.set_PIN2(self.PIN2_SETT.value("PIN2")) - self.parameters.set_PUK2(self.PUK2_SETT.value("PUK2")) - self.parameters.set_ADM1(self.ADM1_SETT.value("ADM1")) - self.parameters.set_ADM6(self.ADM6_SETT.value("ADM6")) - # self.parameters.set_K4(self.K4_SETT.value("K4")) - # self.parameters.set_OP(self.OP_SETT.value("OP")) - self.parameters.set_DATA_SIZE(self.DATA_SIZE_SETT.value("DATA_SIZE")) - - self.parameters.set_PIN1_RAND( - self.valueToBool(self.PIN1_RAND_CHECK_SETT.value("PIN1_RAND")) - ) - self.parameters.set_PIN2_RAND( - self.valueToBool(self.PIN2_RAND_CHECK_SETT.value("PIN2_RAND")) - ) - self.parameters.set_PUK1_RAND( - self.valueToBool(self.PUK1_RAND_CHECK_SETT.value("PUK1_RAND")) - ) - self.parameters.set_PUK2_RAND( - self.valueToBool(self.PUK2_RAND_CHECK_SETT.value("PUK2_RAND")) - ) - self.parameters.set_ADM1_RAND( - self.valueToBool(self.ADM1_RAND_CHECK_SETT.value("ADM1_RAND")) - ) - self.parameters.set_ADM6_RAND( - self.valueToBool(self.ADM6_RAND_CHECK_SETT.value("ADM6_RAND")) - ) - - -# s=SETTINGS() -# s.save_settings() -# s.load_settings() - -__all__ = ["SETTINGS"] +# from PyQt6.QtCore import QSettings +# from PyQt6.QtWidgets import QWidget +# from .parameters import Parameters + + +# class SETTINGS(QWidget): +# __instance = None + +# def __init__(self, ui): +# """ +# GET and SET settings for GUI +# """ +# super().__init__() +# self.ui = ui +# if SETTINGS.__instance is not None: +# raise Exception( +# "SETTINGS class is a singleton! Use get_instance() to access the instance." +# ) +# else: +# SETTINGS.__instance = self +# self.parameters = Parameters.get_instance() +# self.IMSI_SETT = QSettings("IMSI", "") +# self.ICCID_SETT = QSettings("ICCID", "") +# self.PIN1_SETT = QSettings("PIN1", "") +# self.PUK1_SETT = QSettings("PUK1", "") +# self.PIN2_SETT = QSettings("PIN2", "") +# self.PUK2_SETT = QSettings("PUK2", "") +# self.ADM1_SETT = QSettings("ADM1", "") +# self.ADM6_SETT = QSettings("ADM6", "") +# self.ACC_SETT = QSettings("ACC", "") +# self.K4_SETT = QSettings("K4", "") +# self.OP_SETT = QSettings("OP", "") +# self.DATA_SIZE_SETT = QSettings("DATA_SIZE", "") + +# self.PIN1_RAND_CHECK_SETT = QSettings("PIN1_RAND", "") +# self.PIN2_RAND_CHECK_SETT = QSettings("PIN2_RAND", "") +# self.PUK1_RAND_CHECK_SETT = QSettings("PUK1_RAND", "") +# self.PUK2_RAND_CHECK_SETT = QSettings("PUK2_RAND", "") +# self.ADM1_RAND_CHECK_SETT = QSettings("ADM1_RAND", "") +# self.ADM6_RAND_CHECK_SETT = QSettings("ADM6_RAND", "") + +# # @staticmethod +# # def get_instance(): +# # if SETTINGS.__instance is None: +# # SETTINGS.__instance = SETTINGS() +# # return SETTINGS.__instance + +# def __del__(self): +# self.save_global_params_to_settings() + +# @staticmethod +# def BoolToValue(value: bool): +# if isinstance(value, bool): +# if value: +# return "True" +# else: +# return "False" +# else: +# return value + +# @staticmethod +# def valueToBool(value: str): +# if isinstance(value, str): +# if value.upper() == "TRUE": +# return True +# else: +# return False +# else: +# return value + +# def set_gui_from_settings(self): +# self.ui.imsi_text.setText(self.parameters.get_IMSI()) +# self.ui.iccid_text.setText(self.parameters.get_ICCID()) +# self.ui.pin1_text.setText(self.parameters.get_PIN1()) +# self.ui.puk1_text.setText(self.parameters.get_PUK1()) +# self.ui.pin2_text.setText(self.parameters.get_PIN2()) +# self.ui.puk2_text.setText(self.parameters.get_PUK2()) +# self.ui.adm1_text.setText(self.parameters.get_ADM1()) +# self.ui.adm6_text.setText(self.parameters.get_ADM6()) +# self.ui.k4_key_text.setText(self.parameters.get_K4()) +# self.ui.op_key_text.setText(self.parameters.get_OP()) +# self.ui.data_size_text.setText(self.parameters.get_DATA_SIZE()) +# self.ui.pin1_rand_check.setChecked(bool(self.parameters.get_PIN1_RAND())) +# self.ui.pin2_rand_check.setChecked(bool(self.parameters.get_PIN2_RAND())) +# self.ui.puk1_rand_check.setChecked(bool(self.parameters.get_PUK1_RAND())) +# self.ui.puk2_rand_check.setChecked(bool(self.parameters.get_PUK2_RAND())) +# self.ui.adm1_rand_check.setChecked(bool(self.parameters.get_ADM1_RAND())) +# self.ui.adm6_rand_check.setChecked(bool(self.parameters.get_ADM6_RAND())) + +# def save_global_params_to_settings(self): +# self.IMSI_SETT.setValue("IMSI", self.parameters.get_IMSI()) +# self.ICCID_SETT.setValue("ICCID", self.parameters.get_ICCID()) +# self.PIN1_SETT.setValue("PIN1", self.parameters.get_PIN1()) +# self.PUK1_SETT.setValue("PUK1", self.parameters.get_PUK1()) +# self.PIN2_SETT.setValue("PIN2", self.parameters.get_PIN2()) +# self.PUK2_SETT.setValue("PUK2", self.parameters.get_PUK2()) +# self.ADM1_SETT.setValue("ADM1", self.parameters.get_ADM1()) +# self.ADM6_SETT.setValue("ADM6", self.parameters.get_ADM6()) +# self.K4_SETT.setValue("K4", self.parameters.get_K4()) +# self.OP_SETT.setValue("OP", self.parameters.get_OP()) +# self.DATA_SIZE_SETT.setValue("DATA_SIZE", self.parameters.get_DATA_SIZE()) + +# self.PIN1_RAND_CHECK_SETT.setValue( +# "PIN1_RAND", self.BoolToValue(self.parameters.get_PIN1_RAND()) +# ) +# self.PIN2_RAND_CHECK_SETT.setValue( +# "PIN2_RAND", self.BoolToValue(self.parameters.get_PIN2_RAND()) +# ) +# self.PUK1_RAND_CHECK_SETT.setValue( +# "PUK1_RAND", self.BoolToValue(self.parameters.get_PUK1_RAND()) +# ) +# self.PUK2_RAND_CHECK_SETT.setValue( +# "PUK2_RAND", self.BoolToValue(self.parameters.get_PUK2_RAND()) +# ) +# self.ADM1_RAND_CHECK_SETT.setValue( +# "ADM1_RAND", self.BoolToValue(self.parameters.get_ADM1_RAND()) +# ) +# self.ADM6_RAND_CHECK_SETT.setValue( +# "ADM6_RAND", self.BoolToValue(self.parameters.get_ADM6_RAND()) +# ) + +# def load_settings_to_global(self): +# self.parameters.set_IMSI(self.IMSI_SETT.value("IMSI")) +# self.parameters.set_ICCID(self.ICCID_SETT.value("ICCID")) +# self.parameters.set_PIN1(self.PIN1_SETT.value("PIN1")) +# self.parameters.set_PUK1(self.PUK1_SETT.value("PUK1")) +# self.parameters.set_PIN2(self.PIN2_SETT.value("PIN2")) +# self.parameters.set_PUK2(self.PUK2_SETT.value("PUK2")) +# self.parameters.set_ADM1(self.ADM1_SETT.value("ADM1")) +# self.parameters.set_ADM6(self.ADM6_SETT.value("ADM6")) +# # self.parameters.set_K4(self.K4_SETT.value("K4")) +# # self.parameters.set_OP(self.OP_SETT.value("OP")) +# self.parameters.set_DATA_SIZE(self.DATA_SIZE_SETT.value("DATA_SIZE")) + +# self.parameters.set_PIN1_RAND( +# self.valueToBool(self.PIN1_RAND_CHECK_SETT.value("PIN1_RAND")) +# ) +# self.parameters.set_PIN2_RAND( +# self.valueToBool(self.PIN2_RAND_CHECK_SETT.value("PIN2_RAND")) +# ) +# self.parameters.set_PUK1_RAND( +# self.valueToBool(self.PUK1_RAND_CHECK_SETT.value("PUK1_RAND")) +# ) +# self.parameters.set_PUK2_RAND( +# self.valueToBool(self.PUK2_RAND_CHECK_SETT.value("PUK2_RAND")) +# ) +# self.parameters.set_ADM1_RAND( +# self.valueToBool(self.ADM1_RAND_CHECK_SETT.value("ADM1_RAND")) +# ) +# self.parameters.set_ADM6_RAND( +# self.valueToBool(self.ADM6_RAND_CHECK_SETT.value("ADM6_RAND")) +# ) + + +# # s=SETTINGS() +# # s.save_settings() +# # s.load_settings() + +# __all__ = ["SETTINGS"] diff --git a/tests/python/executor/test_script_gpt.py b/tests/python/executor/test_script_gpt.py index 9b4e226..e69de29 100644 --- a/tests/python/executor/test_script_gpt.py +++ b/tests/python/executor/test_script_gpt.py @@ -1,159 +0,0 @@ -import pytest -import pandas as pd -from unittest.mock import MagicMock, patch - -from gsm_data_generator.executor import DataGenerationScript - -# ---------------------------- -# FIXTURES -# ---------------------------- - -# @pytest.fixture -# def mock_config(): -# """Mock config_holder with DISP + PARAMETERS attributes.""" -# class DISP: -# server_data_sep = "|" -# elect_data_sep = "," -# graph_data_sep = ";" -# K4, op, imsi, iccid = "K4VAL", "OPVAL", "IMSI001", "ICCID001" -# pin1, puk1, pin2, puk2 = "1111", "22222222", "3333", "44444444" -# adm1, adm6 = "55555555", "66666666" -# size = 2 -# elect_check, graph_check, server_check = True, True, True -# pin1_fix, puk1_fix, pin2_fix, puk2_fix, adm1_fix, adm6_fix = False, False, False, False, False, False - -# class PARAMETERS: -# data_variables = ["d1", "d2"] -# laser_variables = {"l1": 1} -# server_variables = ["s1", "s2"] - -# return MagicMock(DISP=DISP, PARAMETERS=PARAMETERS) - -# @pytest.fixture -# def script(mock_config): -# """Return a DataGenerationScript with patched dependencies.""" -# with patch("gsm_data_generator.globals") as MockParams, \ -# patch("gsm_data_generator.globals") as MockDFs: - -# # Mock Parameters singleton -# mock_params = MagicMock() -# mock_params.get_K4.return_value = "K4VAL" -# mock_params.get_OP.return_value = "OPVAL" -# mock_params.get_IMSI.return_value = "IMSI001" -# mock_params.get_ICCID.return_value = "ICCID001" -# mock_params.get_DATA_SIZE.return_value = 2 -# MockParams.get_instance.return_value = mock_params - -# # Mock DataFrames singleton -# mock_dfs = MagicMock() -# mock_dfs.get_input_df.return_value = pd.DataFrame( -# {"ICCID": ["I1", "I2"], "IMSI": ["M1", "M2"]} -# ) -# MockDFs.get_instance.return_value = mock_dfs - -# # Return script instance -# return DataGenerationScript(config_holder=mock_config, params=mock_params, dataframes=mock_dfs) - - -# ---------------------------- -# TESTS -# ---------------------------- - -# def test_json_to_global_params(script, mock_config): -# script.json_to_global_params() -# # Verify DISP values mapped correctly -# script.params.set_SERVER_SEP.assert_called_once_with(mock_config.DISP.server_data_sep) -# script.params.set_ELECT_DICT.assert_called_once() - - -# def test_generate_code_fixed(script): -# script.params.get_PIN1_RAND.return_value = True -# script.params.get_PIN1.return_value = "9999" -# assert script.generate_code("PIN1", 4) == "9999" - - -# def test_generate_code_random(script): -# script.params.get_PIN1_RAND.return_value = False -# script.data_generator.generate_4_digit = MagicMock(return_value="1234") -# assert script.generate_code("PIN1", 4) == "1234" - - -# def test_apply_function(script): -# df = pd.DataFrame({"KI": ["aaa"], "EKI": [""]}) -# df_out = script.apply_function(df, "EKI", "KI", lambda x: x.upper()) -# assert df_out["EKI"].iloc[0] == "AAA" - - -# def test_apply_functions_generates_columns(script): -# # Mock generators -# script.data_generator.generate_4_digit = MagicMock(return_value="1111") -# script.data_generator.generate_8_digit = MagicMock(return_value="22222222") -# script.data_generator.generate_ki = MagicMock(return_value="KI001") -# script.data_generator.generate_otas = MagicMock(return_value="OTAS1") -# script.dep_data_generator.calculate_acc = MagicMock(return_value="ACC1") -# script.generate_eki = MagicMock(return_value="EKI001") -# script.generate_opc = MagicMock(return_value="OPC001") - -# df = pd.DataFrame({ -# "ICCID": ["iccid"], -# "IMSI": ["imsi"], -# "PIN1": [""], "PIN2": [""], -# "PUK1": [""], "PUK2": [""], -# "ADM1": [""], "ADM6": [""], -# "KI": [""], -# "ACC": [""], -# "EKI": [""], "OPC": [""], -# "KIC1": [""], "KID1": [""], "KIK1": [""], -# }) - -# df_out = script.apply_functions(df) - -# assert df_out["PIN1"].iloc[0] == "1111" -# assert df_out["PUK1"].iloc[0] == "22222222" -# assert df_out["KI"].iloc[0] == "KI001" -# assert df_out["EKI"].iloc[0] == "EKI001" -# assert df_out["OPC"].iloc[0] == "OPC001" -# assert df_out["KIC1"].iloc[0] == "OTAS1" - - -# def test_generate_demo_data(script): -# script.df_processor.generate_empty_dataframe = MagicMock( -# return_value=pd.DataFrame({"ICCID": [""], "IMSI": [""], "KI": [""], "ACC": [""], "EKI": [""], "OPC": [""]}) -# ) -# script.df_processor.initialize_column = MagicMock() - -# script.apply_functions = MagicMock(return_value="DF_OUT") -# df_out = script.generate_demo_data() -# assert df_out == "DF_OUT" - - -# def test_generate_non_demo_data(script): -# script.df_processor.generate_empty_dataframe = MagicMock( -# return_value=pd.DataFrame({"ICCID": [""], "IMSI": [""], "KI": [""], "ACC": [""], "EKI": [""], "OPC": [""]}) -# ) -# script.df_processor.initialize_column = MagicMock() -# script.apply_functions = MagicMock(return_value="DF_OUT") - -# df_out = script.generate_non_demo_data() -# assert df_out == "DF_OUT" - - -# def test_generate_initial_data_demo(script): -# script.generate_demo_data = MagicMock(return_value="DEMO_DF") -# df, keys = script.generate_initial_data(is_demo=True) -# assert df == "DEMO_DF" -# assert "k4" in keys and "op" in keys - - -# def test_process_final_data_with_encoding_and_clip(script): -# # Mock df -# df_input = pd.DataFrame({"A": [1, 2]}) -# script.df_processor.encode_dataframe = MagicMock(return_value=df_input) -# script.data_processor.extract_parameter_info = MagicMock( -# return_value=(["A"], None, None, None, [0], [1]) -# ) -# script.df_processor.add_duplicate_columns = MagicMock(return_value=df_input) -# script.df_processor.clip_columns = MagicMock(return_value="CLIPPED_DF") - -# result = script.process_final_data({}, df_input, clip=True, encoding=True) -# assert result == "CLIPPED_DF" diff --git a/tests/python/parser/test_parser.py b/tests/python/parser/parser.py similarity index 98% rename from tests/python/parser/test_parser.py rename to tests/python/parser/parser.py index ebf8efa..7dd0b91 100644 --- a/tests/python/parser/test_parser.py +++ b/tests/python/parser/parser.py @@ -1,8 +1,6 @@ # test_config.py import json import pytest -from pathlib import Path -import gsm_data_generator from gsm_data_generator.parser.utils import ( DISP, PATHS, diff --git a/tests/python/utils/test_conv.py b/tests/python/utils/test_conv.py index 4694da9..382d03d 100644 --- a/tests/python/utils/test_conv.py +++ b/tests/python/utils/test_conv.py @@ -3,6 +3,7 @@ from gsm_data_generator.utils import dict_2_list, list_2_dict + def test_list_2_dict_basic(): data = ["A", "B", "C"] result = list_2_dict(data)