Repository: radomirbosak/duden (language: python)

Issue:
Check on test data freshness
To reproduce:

1. clean cache
```
$ rm ~/.cache/duden/*
```

2. run tests

```shell
$ make test
...
====================================================== short test summary info =======================================================
FAILED tests/test_online_attributes.py::test_basic_attributes[title-None-expected_dict7] - AttributeError: 'NoneType' object has no...
FAILED tests/test_online_attributes.py::test_basic_attributes[name-None-expected_dict7] - AttributeError: 'NoneType' object has no ...
FAILED tests/test_online_attributes.py::test_basic_attributes[article-None-expected_dict7] - AttributeError: 'NoneType' object has ...
FAILED tests/test_online_attributes.py::test_basic_attributes[part_of_speech-None-expected_dict7] - AttributeError: 'NoneType' obje...
FAILED tests/test_online_attributes.py::test_basic_attributes[frequency-None-expected_dict7] - AttributeError: 'NoneType' object ha...
FAILED tests/test_online_attributes.py::test_basic_attributes[usage-None-expected_dict7] - AttributeError: 'NoneType' object has no...
FAILED tests/test_online_attributes.py::test_basic_attributes[word_separation-None-expected_dict7] - AttributeError: 'NoneType' obj...
FAILED tests/test_online_attributes.py::test_basic_attributes[synonyms-None-expected_dict7] - AttributeError: 'NoneType' object has...
FAILED tests/test_online_attributes.py::test_basic_attributes[origin-None-expected_dict7] - AttributeError: 'NoneType' object has n...
FAILED tests/test_online_attributes.py::test_basic_attributes[words_before-parsed_word1-expected_dict1] - AssertionError: assert ['...
FAILED tests/test_online_attributes.py::test_basic_attributes[words_before-None-expected_dict7] - AttributeError: 'NoneType' object...
FAILED tests/test_online_attributes.py::test_basic_attributes[words_after-None-expected_dict7] - AttributeError: 'NoneType' object ...
FAILED tests/test_online_attributes.py::test_meaning_overview[None-expected_dict7] - AttributeError: 'NoneType' object has no attri...
FAILED tests/test_online_attributes.py::test_word_compounds[None-expected_dict7] - AttributeError: 'NoneType' object has no attribu...
FAILED tests/test_online_attributes.py::test_word_grammar[parsed_word6-expected_dict6] - AssertionError: assert [({'Indikativ.../di...
FAILED tests/test_online_attributes.py::test_word_grammar[None-expected_dict7] - AttributeError: 'NoneType' object has no attribute...
=================================================== 16 failed, 97 passed in 29.38s ===================================================
make: *** [Makefile:7: test] Error 1
```


Discussion / hints:

Fix patch:
diff --git a/Makefile b/Makefile
index c6cbcd7..c882847 100644
--- a/Makefile
+++ b/Makefile
@@ -36,3 +36,12 @@ completions-install-bash:
 
 completions-install-fish:
 	cp completions/duden.fish ~/.config/fish/completions/
+
+update-test-data:
+	./run_duden.py --export Barmherzigkeit > tests/test_data/Barmherzigkeit.yaml
+	./run_duden.py --export Feiertag > tests/test_data/Feiertag.yaml
+	./run_duden.py --export laufen > tests/test_data/laufen.yaml
+	./run_duden.py --export Qat > tests/test_data/Qat.yaml
+	./run_duden.py --export Kragen > tests/test_data/Kragen.yaml
+	./run_duden.py --export Petersilie > tests/test_data/Petersilie.yaml
+	./run_duden.py --export einfach -r1 > tests/test_data/einfach.yaml


Test patch:
diff --git a/tests/test_data/Petersilie.yaml b/tests/test_data/Petersilie.yaml
index 5798099..955db9a 100644
--- a/tests/test_data/Petersilie.yaml
+++ b/tests/test_data/Petersilie.yaml
@@ -41,7 +41,8 @@ grammar_raw:
     - Plural
   - die Petersilien
 synonyms:
-- (schweizerisch) Peterli; (bayrisch, österreichisch umgangssprachlich) Petersil; (südwestdeutsch und schweizerisch mundartlich) Peterle
+- (schweizerisch) Peterli; (bayrisch, österreichisch umgangssprachlich) Petersil;
+  (südwestdeutsch und schweizerisch mundartlich) Peterle
 words_before:
 - Peter-Paul-Kirche
 - Petersburg
diff --git a/tests/test_data/Qat.yaml b/tests/test_data/Qat.yaml
index 77e3310..69058a5 100644
--- a/tests/test_data/Qat.yaml
+++ b/tests/test_data/Qat.yaml
@@ -15,9 +15,9 @@ synonyms: null
 words_before:
 - q
 - q
-- q
 - Q
 - Q.
+- QAnon
 words_after:
 - QbA
 - Q. b. A.
diff --git a/tests/test_data/laufen.yaml b/tests/test_data/laufen.yaml
index d389938..adb2fb5 100644
--- a/tests/test_data/laufen.yaml
+++ b/tests/test_data/laufen.yaml
@@ -66,12 +66,12 @@ grammar_raw:
     - Person I
     - Präsens
     - Singular
-  - ich laufe
+  - ich laufe (mich/mir)
 - - - Konjunktiv I
     - Person I
     - Präsens
     - Singular
-  - ich laufe
+  - ich laufe (mich/mir)
 - - - Imperativ
     - Person I
     - Präsens
@@ -81,27 +81,27 @@ grammar_raw:
     - Person II
     - Präsens
     - Singular
-  - du läufst
+  - du läufst (dich/dir)
 - - - Konjunktiv I
     - Person II
     - Präsens
     - Singular
-  - du laufest
+  - du laufest (dich/dir)
 - - - Imperativ
     - Person II
     - Präsens
     - Singular
-  - lauf, laufe!
+  - lauf (dich/dir), laufe (dich/dir)!
 - - - Indikativ
     - Person III
     - Präsens
     - Singular
-  - er/sie/es läuft
+  - er/sie/es läuft (sich)
 - - - Konjunktiv I
     - Person III
     - Präsens
     - Singular
-  - er/sie/es laufe
+  - er/sie/es laufe (sich)
 - - - Imperativ
     - Person III
     - Präsens
@@ -111,12 +111,12 @@ grammar_raw:
     - Person I
     - Plural
     - Präsens
-  - wir laufen
+  - wir laufen (uns)
 - - - Konjunktiv I
     - Person I
     - Plural
     - Präsens
-  - wir laufen
+  - wir laufen (uns)
 - - - Imperativ
     - Person I
     - Plural
@@ -126,27 +126,27 @@ grammar_raw:
     - Person II
     - Plural
     - Präsens
-  - ihr lauft
+  - ihr lauft (euch)
 - - - Konjunktiv I
     - Person II
     - Plural
     - Präsens
-  - ihr laufet
+  - ihr laufet (euch)
 - - - Imperativ
     - Person II
     - Plural
     - Präsens
-  - lauft!
+  - lauft (euch)!
 - - - Indikativ
     - Person III
     - Plural
     - Präsens
-  - sie laufen
+  - sie laufen (sich)
 - - - Konjunktiv I
     - Person III
     - Plural
     - Präsens
-  - sie laufen
+  - sie laufen (sich)
 - - - Imperativ
     - Person III
     - Plural
@@ -156,62 +156,62 @@ grammar_raw:
     - Person I
     - Präteritum
     - Singular
-  - ich lief
+  - ich lief (mich/mir)
 - - - Konjunktiv II
     - Person I
     - Präteritum
     - Singular
-  - ich liefe
+  - ich liefe (mich/mir)
 - - - Indikativ
     - Person II
     - Präteritum
     - Singular
-  - du liefst
+  - du liefst (dich/dir)
 - - - Konjunktiv II
     - Person II
     - Präteritum
     - Singular
-  - du liefest
+  - du liefest (dich/dir)
 - - - Indikativ
     - Person III
     - Präteritum
     - Singular
-  - er/sie/es lief
+  - er/sie/es lief (sich)
 - - - Konjunktiv II
     - Person III
     - Präteritum
     - Singular
-  - er/sie/es liefe
+  - er/sie/es liefe (sich)
 - - - Indikativ
     - Person I
     - Plural
     - Präteritum
-  - wir liefen
+  - wir liefen (uns)
 - - - Konjunktiv II
     - Person I
     - Plural
     - Präteritum
-  - wir liefen
+  - wir liefen (uns)
 - - - Indikativ
     - Person II
     - Plural
     - Präteritum
-  - ihr lieft
+  - ihr lieft (euch)
 - - - Konjunktiv II
     - Person II
     - Plural
     - Präteritum
-  - ihr liefet
+  - ihr liefet (euch)
 - - - Indikativ
     - Person III
     - Plural
     - Präteritum
-  - sie liefen
+  - sie liefen (sich)
 - - - Konjunktiv II
     - Person III
     - Plural
     - Präteritum
-  - sie liefen
+  - sie liefen (sich)
 - - - Partizip I
   - laufend
 - - - Partizip II
diff --git a/tests/test_online_attributes.py b/tests/test_online_attributes.py
index 2dc347c..5a23890 100644
--- a/tests/test_online_attributes.py
+++ b/tests/test_online_attributes.py
@@ -16,11 +16,10 @@
 WordTestRecord = namedtuple('WordTestRecord', ["parsed_word", "expected_dict"])
 
 
-def generate_word_data():
+def iterate_test_yaml():
     """
-    Download actual words from duden corresponding to test words from `TEST_DATA_DIR`
+    Iterate over .yaml file contents in test data directory
     """
-    data = []
     for filename in os.listdir(TEST_DATA_DIR):
         full_path = os.path.join(TEST_DATA_DIR, filename)
 
@@ -30,12 +29,17 @@ def generate_word_data():
 
         # store real and expected result
         with open(full_path, 'r', encoding="UTF-8") as f:
-            expected_dict = yaml.load(f, Loader=yaml.SafeLoader)
-        parsed_word = get(expected_dict['urlname'])
+            yield yaml.load(f, Loader=yaml.SafeLoader)
 
-        record = WordTestRecord(parsed_word, expected_dict)
-        data.append(record)
-    return data
+
+def generate_word_data():
+    """
+    Download actual words from duden corresponding to test words from `TEST_DATA_DIR`
+    """
+    return [
+        WordTestRecord(get(expected_dict['urlname']), expected_dict)
+        for expected_dict in iterate_test_yaml()
+    ]
 
 
 # set up test parameters matrix