class TestDatasetCheckDatasetLists:
    def setup(self):
        self.uut = DatasetCheck({}, '', '')
        self.uut._report_unknown_dataset_entry = MagicMock()
        self.uut._check_misuse_location_exists = MagicMock()

    def test_unknown_entry(self):
        self.uut.datasets = {"-dataset-": ["-unknown-entry-"]}

        self.uut.end()

        self.uut._report_unknown_dataset_entry.assert_any_call(
            "-dataset-", "-unknown-entry-")

    def test_no_warning_on_known_project(self):
        project = create_project("-project-", meta=EMPTY_META)
        self.uut.datasets = {"-dataset-": [project.id]}

        self.uut.process_project(project)
        self.uut.end()

        self.uut._report_unknown_dataset_entry.assert_not_called()

    def test_no_warning_on_known_version(self):
        project = create_project("-project-", meta=EMPTY_META)
        version = create_version("-version-", project=project, meta=EMPTY_META)
        self.uut.datasets = {"-dataset-": [version.id]}

        self.uut.process_project_version(project, version)
        self.uut.end()

        self.uut._report_unknown_dataset_entry.assert_not_called()

    def test_no_warning_on_known_misuse(self):
        project = create_project("-project-", meta=EMPTY_META)
        misuse = create_misuse("-misuse-", project=project, meta=EMPTY_META)
        version = create_version("-version-",
                                 project=project,
                                 misuses=[misuse],
                                 meta=EMPTY_META)
        self.uut.datasets = {"-dataset-": [misuse.id]}

        self.uut.process_project_version_misuse(project, version, misuse)
        self.uut.end()

        self.uut._report_unknown_dataset_entry.assert_not_called()

    def test_invalid_violation_type(self):
        meta = {"characteristics": ["invalid/violation_type"]}
        project = create_project("-project-", meta=EMPTY_META)
        misuse = create_misuse("-id-", project=project, meta=meta)
        version = create_version("-version-",
                                 meta=EMPTY_META,
                                 project=project,
                                 misuses=[misuse])
        self.uut._report_invalid_violation_type = MagicMock()

        self.uut.process_project_version_misuse(project, version, misuse)

        self.uut._report_invalid_violation_type.assert_any_call(
            "invalid/violation_type", "-project-/misuses/-id-/misuse.yml")

    def test_valid_violation_type(self):
        meta = {"characteristics": ["missing/condition/value_or_state"]}
        project = create_project("-project-", meta=EMPTY_META)
        misuse = create_misuse("-id-", project=project, meta=meta)
        version = create_version("-version-",
                                 meta=EMPTY_META,
                                 project=project,
                                 misuses=[misuse])
        self.uut._report_invalid_violation_type = MagicMock()

        self.uut.process_project_version_misuse(project, version, misuse)

        self.uut._report_invalid_violation_type.assert_not_called()
class TestDatasetCheckProject:
    def setup(self):
        self.uut = DatasetCheck({}, '', '')
        self.uut._report_missing_key = MagicMock()
        self.uut._check_misuse_location_exists = MagicMock()

    def test_missing_name(self):
        meta = {
            "repository": {
                "type": "git",
                "url": "https://github.com/stg-tud/MUBench.git"
            }
        }
        project = create_project("-id-", meta=meta)

        self.uut.process_project(project)

        self.uut._report_missing_key.assert_any_call("name",
                                                     "-id-/project.yml")

    def test_missing_repository(self):
        meta = {"name": "-project-name-"}
        project = create_project("-id-", meta=meta)

        self.uut.process_project(project)

        self.uut._report_missing_key.assert_any_call("repository",
                                                     "-id-/project.yml")

    def test_missing_repository_type(self):
        meta = {
            "name": "-project-name-",
            "repository": {
                "url": "https://github.com/stg-tud/MUBench.git"
            }
        }
        project = create_project("-id-", meta=meta)

        self.uut.process_project(project)

        self.uut._report_missing_key.assert_any_call("repository.type",
                                                     "-id-/project.yml")

    def test_missing_repository_url(self):
        meta = {"name": "-project-name-", "repository": {"type": "git"}}
        project = create_project("-id-", meta=meta)

        self.uut.process_project(project)

        self.uut._report_missing_key.assert_any_call("repository.url",
                                                     "-id-/project.yml")

    def test_version_and_misuse_with_same_name(self):
        self.uut._report_id_conflict = MagicMock()
        project = create_project("-project-", meta=EMPTY_META)
        misuse = create_misuse("-conflict-", project=project, meta=EMPTY_META)
        version = create_version("-conflict-",
                                 project=project,
                                 misuses=[misuse],
                                 meta=EMPTY_META)

        self.uut.process_project(project)

        self.uut._report_id_conflict.assert_any_call("-project-.-conflict-")

    def test_version_and_misuse_from_different_version_with_same_name(self):
        self.uut._report_id_conflict = MagicMock()
        project = create_project("-project-", meta=EMPTY_META)
        misuse_with_conflict = create_misuse("-conflict-",
                                             project=project,
                                             meta=EMPTY_META)
        version = create_version("-version-",
                                 project=project,
                                 misuses=[misuse_with_conflict],
                                 meta=EMPTY_META)
        version_with_conflict = create_version("-conflict-",
                                               project=project,
                                               misuses=[],
                                               meta=EMPTY_META)

        self.uut.process_project(project)

        self.uut._report_id_conflict.assert_any_call("-project-.-conflict-")

    def test_no_id_conflict_on_synthetic_repositories(self):
        self.uut._report_id_conflict = MagicMock()
        project = create_project("-project-",
                                 meta={"repository": {
                                     "type": "synthetic"
                                 }})
        misuse = create_misuse("-conflict-", project=project, meta=EMPTY_META)
        version = create_version("-conflict-",
                                 project=project,
                                 misuses=[misuse],
                                 meta=EMPTY_META)

        self.uut.process_project(project)

        self.uut._report_id_conflict.assert_not_called()

    def test_synthetic_no_url(self):
        meta = {"name": "-project-name-", "repository": {"type": "synthetic"}}
        project = create_project("-id-", meta=meta)

        self.uut.process_project(project)

        self.uut._report_missing_key.assert_not_called()