File size: 1,474 Bytes
1bb570d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from __future__ import annotations

import importlib.util
from pathlib import Path


SCRIPT = Path(__file__).parent.parent / "scripts" / "prepare_training_dataset.py"
SPEC = importlib.util.spec_from_file_location("prepare_training_dataset", SCRIPT)
MODULE = importlib.util.module_from_spec(SPEC)
assert SPEC.loader is not None
SPEC.loader.exec_module(MODULE)


def component(cas: str, weight: float) -> dict:
    return {"cas": cas, "name": cas, "weight_fraction": weight}


def test_curate_consolidates_ingredients_and_removes_exact_formula_duplicates():
    rows = [
        {
            "formula": [component("1-11-1", 0.2), component("2-22-2", 0.5), component("1-11-1", 0.3)],
            "metadata": {"generation_strategy": "floral"},
        },
        {
            "formula": [component("1-11-1", 0.5), component("2-22-2", 0.5)],
            "metadata": {"generation_strategy": "floral"},
        },
    ]

    curated, audit = MODULE.curate(rows)

    assert len(curated) == 1
    assert curated[0]["formula"] == [component("1-11-1", 0.5), component("2-22-2", 0.5)]
    assert audit["rows_with_repeated_ingredients"] == 1
    assert audit["ingredients_consolidated"] == 1
    assert audit["exact_formula_duplicates_removed"] == 1


def test_formula_signature_is_order_independent():
    first = [component("1-11-1", 0.25), component("2-22-2", 0.75)]
    second = list(reversed(first))
    assert MODULE.formula_signature(first) == MODULE.formula_signature(second)