diff --git a/.deepsource.toml b/.deepsource.toml index 1d8ea29..8e10478 100644 --- a/.deepsource.toml +++ b/.deepsource.toml @@ -2,7 +2,8 @@ version = 1 test_patterns = [ "tests/**", - "test_*.py" + "test_*.py", + "tests_integ/**", ] [[analyzers]] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d58839b..6e272bf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,7 +30,7 @@ jobs: run: make mypy - name: Run Tests - run: make test + run: make test-integ - name: Upload Coverage uses: codecov/codecov-action@v3 diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index bdd502f..72f33b1 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -85,6 +85,28 @@ jobs: - name: Build run: poetry build + integ: + needs: + - test + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: 3.8 + + - name: Install Poetry + run: pip install poetry==1.7 + + - name: Install Dependencies + run: poetry install --with=dev + + - name: Run Integration Tests + run: make test-integ + codecov: needs: - lint diff --git a/.pytest-tests.ini b/.pytest-tests.ini new file mode 100644 index 0000000..57b5c20 --- /dev/null +++ b/.pytest-tests.ini @@ -0,0 +1,5 @@ +[pytest] +addopts = --cov json_logic_asp/ --cov-report html --cov-report xml --cov-report term +testpaths = + tests +log_level = DEBUG diff --git a/.pytest-tests_integ.ini b/.pytest-tests_integ.ini new file mode 100644 index 0000000..1b7812b --- /dev/null +++ b/.pytest-tests_integ.ini @@ -0,0 +1,4 @@ +[pytest] +testpaths = + tests_integ +log_level = INFO diff --git a/Makefile b/Makefile index 692ae98..eaceef9 100644 --- a/Makefile +++ b/Makefile @@ -1,24 +1,27 @@ -.PHONY: target format lint test pr build +.PHONY: target format lint test test-integ pr build target: @$(MAKE) pr format: - poetry run ruff format json_logic_asp/ tests/ + poetry run ruff format json_logic_asp/ tests/ tests_integ/ lint: format - poetry run ruff check --fix json_logic_asp/ tests/ + poetry run ruff check --fix json_logic_asp/ tests/ tests_integ/ lint-strict: format - poetry run ruff check json_logic_asp/ tests/ + poetry run ruff check json_logic_asp/ tests/ tests_integ/ mypy: - poetry run mypy --pretty --check-untyped-def json_logic_asp/ tests/ + poetry run mypy --pretty --check-untyped-def json_logic_asp/ tests/ tests_integ/ test: - poetry run pytest + poetry run pytest -c .pytest-tests.ini -pr: lint mypy test +test-integ: test + poetry run pytest -c .pytest-tests_integ.ini -v + +pr: lint mypy test-integ build: pr poetry build diff --git a/pyproject.toml b/pyproject.toml index f83afed..c97b790 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,13 +53,6 @@ requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" -[tool.pytest.ini_options] -addopts = "--cov json_logic_asp/ --cov-report html --cov-report xml --cov-report term" -testpaths = [ - "tests", -] -log_level = "DEBUG" - [tool.ruff] line-length = 120 diff --git a/tests_integ/__init__.py b/tests_integ/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests_integ/test_data_translations/simple.json b/tests_integ/test_data_translations/simple.json new file mode 100644 index 0000000..eedb96a --- /dev/null +++ b/tests_integ/test_data_translations/simple.json @@ -0,0 +1,7 @@ +{ + "a": "b", + "c": 3, + "d": { + "e": 48 + } +} diff --git a/tests_integ/test_data_translations/simple.lp b/tests_integ/test_data_translations/simple.lp new file mode 100644 index 0000000..2e961fd --- /dev/null +++ b/tests_integ/test_data_translations/simple.lp @@ -0,0 +1,6 @@ +% a : b +var(s0cc175b9c0f1b6a831c399e269772661, s92eb5ffee6ae2fec3ad71c777531578f). +% c : 3 +var(s4a8a08f09d37b73795649038408b5f33, 3). +% d.e : 48 +var(s405f7563a1a79cad802baab832d146dd, 48). diff --git a/tests_integ/test_evaluation.py b/tests_integ/test_evaluation.py new file mode 100644 index 0000000..e69de29 diff --git a/tests_integ/test_rule_translations/simple.json b/tests_integ/test_rule_translations/simple.json new file mode 100644 index 0000000..4c41c5d --- /dev/null +++ b/tests_integ/test_rule_translations/simple.json @@ -0,0 +1,6 @@ +{ + "==": [ + {"var": "a"}, + "b" + ] +} \ No newline at end of file diff --git a/tests_integ/test_rule_translations/simple.lp b/tests_integ/test_rule_translations/simple.lp new file mode 100644 index 0000000..7655b75 --- /dev/null +++ b/tests_integ/test_rule_translations/simple.lp @@ -0,0 +1,4 @@ +% a EQ b +eq(mock2) :- var(s0cc175b9c0f1b6a831c399e269772661, V1), V1 == s92eb5ffee6ae2fec3ad71c777531578f. +% simple +rule(s8dbdda48fb8748d6746f1965824e966a) :- eq(mock2). diff --git a/tests_integ/test_translation.py b/tests_integ/test_translation.py new file mode 100644 index 0000000..a332df2 --- /dev/null +++ b/tests_integ/test_translation.py @@ -0,0 +1,66 @@ +import json +from os import listdir +from os.path import isfile, join +from pathlib import Path + +import pytest + +from json_logic_asp.models.translator_dto import DataInput, RuleInput +from json_logic_asp.translator import generate_single_data_asp_definition, generate_single_rule_asp_definition +from tests.fixtures import cuid_fixture # noqa + +TESTS_RULES_FOLDER = Path(__file__).parent / "test_rule_translations" +TESTS_RULES_FILE_NAMES = list( + set([f.split(".")[0] for f in listdir(TESTS_RULES_FOLDER) if isfile(join(TESTS_RULES_FOLDER, f))]) +) + +TESTS_DATAS_FOLDER = Path(__file__).parent / "test_data_translations" +TESTS_DATAS_FILE_NAMES = list( + set([f.split(".")[0] for f in listdir(TESTS_DATAS_FOLDER) if isfile(join(TESTS_DATAS_FOLDER, f))]) +) + + +@pytest.mark.parametrize( + "file_name", + TESTS_RULES_FILE_NAMES, + ids=TESTS_RULES_FILE_NAMES, +) +def test_rule_translation(file_name): + with open(TESTS_RULES_FOLDER / f"{file_name}.json") as f: + jl_rule = json.loads(f.read()) + + with open(TESTS_RULES_FOLDER / f"{file_name}.lp") as f: + expected_asp_rule = f.read() + + asp_rule = generate_single_rule_asp_definition( + rule_input=RuleInput( + rule_id=file_name, + rule_tree=jl_rule, + ), + with_comments=True, + ) + + assert asp_rule.strip() == expected_asp_rule.strip() + + +@pytest.mark.parametrize( + "file_name", + TESTS_DATAS_FILE_NAMES, + ids=TESTS_DATAS_FILE_NAMES, +) +def test_data_translation(file_name): + with open(TESTS_DATAS_FOLDER / f"{file_name}.json") as f: + data_object = json.loads(f.read()) + + with open(TESTS_DATAS_FOLDER / f"{file_name}.lp") as f: + expected_asp_data = f.read() + + asp_data = generate_single_data_asp_definition( + data_input=DataInput( + data_id=file_name, + data_object=data_object, + ), + with_comments=True, + ) + + assert asp_data.strip() == expected_asp_data.strip()