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 TestDatasetCheckProjectVersion:
    def setup(self):
        self.uut = DatasetCheck({}, '', '')
        self.uut._report_missing_key = MagicMock()
        self.uut._check_misuse_location_exists = MagicMock()

    def test_missing_revision(self):
        meta = {"misuses": ["1"]}
        project = create_project("-project-", meta=EMPTY_META)
        version = create_version("-id-", meta=meta, project=project)

        self.uut.process_project_version(project, version)

        self.uut._report_missing_key.assert_any_call(
            "revision", "-project-/versions/-id-/version.yml")

    def test_synthetic_no_revision(self):
        meta = {"misuses": ["1"]}
        project = create_project("-project-",
                                 meta={"repository": {
                                     "type": "synthetic"
                                 }})
        version = create_version("-id-", meta=meta, project=project)

        self.uut.process_project_version(project, version)

        assert call("revision", "-project-/versions/-id-/version.yml") \
               not in self.uut._report_missing_key.call_args_list

    def test_missing_misuses(self):
        meta = {"revision": "1"}
        project = create_project("-project-", meta=EMPTY_META)
        version = create_version("-id-", meta=meta, project=project)

        self.uut.process_project_version(project, version)

        self.uut._report_missing_key.assert_any_call(
            "misuses", "-project-/versions/-id-/version.yml")

    def test_empty_misuses(self):
        meta = {"misuses": []}
        project = create_project("-project-", meta=EMPTY_META)
        version = create_version("-id-", meta=meta, project=project)

        self.uut.process_project_version(project, version)

        self.uut._report_missing_key.assert_any_call(
            "misuses", "-project-/versions/-id-/version.yml")

    def test_misuses_none(self):
        project = create_project("-project-", meta=EMPTY_META)
        version = create_version("-id-",
                                 meta={"misuses": None},
                                 project=project)

        self.uut.process_project_version(project, version)

        self.uut._report_missing_key.assert_any_call(
            "misuses", "-project-/versions/-id-/version.yml")

    def test_missing_build(self):
        meta = {"misuses": ["1"]}
        project = create_project("-project-", meta=EMPTY_META)
        version = create_version("-id-", meta=meta, project=project)

        self.uut.process_project_version(project, version)

        self.uut._report_missing_key.assert_any_call(
            "build", "-project-/versions/-id-/version.yml")

    def test_missing_build_classes(self):
        meta = {"build": {}}
        project = create_project("-project-", meta=EMPTY_META)
        version = create_version("-id-", meta=meta, project=project)

        self.uut.process_project_version(project, version)

        self.uut._report_missing_key.assert_any_call(
            "build.classes", "-project-/versions/-id-/version.yml")

    def test_missing_build_commands(self):
        meta = {"build": {}}
        project = create_project("-project-", meta=EMPTY_META)
        version = create_version("-id-", meta=meta, project=project)

        self.uut.process_project_version(project, version)

        self.uut._report_missing_key.assert_any_call(
            "build.commands", "-project-/versions/-id-/version.yml")

    def test_empty_build_commands(self):
        meta = {"build": {"commands": []}}
        project = create_project("-project-", meta=EMPTY_META)
        version = create_version("-id-", meta=meta, project=project)

        self.uut.process_project_version(project, version)

        self.uut._report_missing_key.assert_any_call(
            "build.commands", "-project-/versions/-id-/version.yml")

    def test_missing_build_src(self):
        meta = {"build": {}}
        project = create_project("-project-", meta=EMPTY_META)
        version = create_version("-id-", meta=meta, project=project)

        self.uut.process_project_version(project, version)

        self.uut._report_missing_key.assert_any_call(
            "build.src", "-project-/versions/-id-/version.yml")

    def test_non_existent_misuse(self):
        self.uut._report_unknown_misuse = MagicMock()
        project = create_project("-project-", meta=EMPTY_META)
        version = create_version("-id-",
                                 meta={"misuses": ["-misuse-"]},
                                 project=project)
        version._MISUSES = []

        self.uut.process_project_version(project, version)

        self.uut._report_unknown_misuse.assert_any_call(version.id, "-misuse-")

    def test_existent_misuse(self):
        self.uut._report_unknown_misuse = MagicMock()
        project = create_project("-project-", meta=EMPTY_META)
        version = create_version("-id-",
                                 meta={"misuses": ["-misuse-"]},
                                 project=project)

        project.path = mkdtemp(prefix="mubench_test-dataset-check_")
        try:
            misuse_yml_path = join(project.path, Project.MISUSES_DIR,
                                   "-misuse-", Misuse.MISUSE_FILE)
            create_file(misuse_yml_path)

            self.uut.process_project_version(project, version)

            self.uut._report_unknown_misuse.assert_not_called()
        finally:
            remove_tree(project.path)