Neuer User dschlueter

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-06-22 10:45:40 +02:00
commit c867305f1c
4 changed files with 5 additions and 458 deletions

5
.gitignore vendored
View file

@ -184,12 +184,17 @@ Thumbs.db
# Backup files
*.bak
*.backup
*.old
*.very_old
# Test/temporary lessons files (only data/lessons.json is tracked)
/lessons.json
/meine_lektionen.json
/test_*.json
# Skipped test files
*.skip
# Editor directories and files
.vscode/
.idea/

View file

@ -1,92 +0,0 @@
[
{
"lesson": 1.1,
"title": "01.1 Erarbeitung der Grundstellung",
"text": "ffff jjjj ffff jjjj ffff jjjj ffff jjjj ffff jjjj ffff jjjj\nffjj ffjj ffjj ffjj ffjj ffjj fjfj fjfj fjfj fjfj fjfj fjfj\n\ndddd kkkk dddd kkkk dddd kkkk dddd kkkk dddd kkkk dddd kkkk\nddkk ddkk ddkk ddkk ddkk ddkk ddkk ddkk ddkk ddkk ddkk ddkk\n\nssss llll ssss llll ssss llll ssss llll ssss llll ssss llll\nssll ssll ssll ssll ssll ssll slsl slsl slsl slsl slsl slsl\n\naaaa öööö aaaa öööö aaaa öööö aaaa öööö aaaa öööö aaaa öööö\naaöö aaöö aaöö aaöö aaöö aaöö aöaö aöaö aöaö aöaö aöaö aöaö\n\nasdf jklö asdf jklö asdf jklö asdf jklö asdf jklö asdf jklö\nfdsa ölkj fdsa ölkj fdsa ölkj fdsa ölkj fdsa ölkj fdsa ölkj\n\nafa aja afa aja ada aka ada aka asa ala asa ala aöa aöa asd\nöjö öfö öjö öfö ökö ödö ökö ödö ölö ösö ölö ösö öal ösk ölk\n\nöl ja öl ja öl ja öl öd da öd da öd da sö la sö la sö la sö\nlö aj lö aj lö aj lö dö ad dö ad dö ad ös al ös al ös al ös"
},
{
"lesson": 1.2,
"title": "01.2 Festigung durch Wortübungen",
"text": "all als all als all als all als all als all als all als all\ndas las das las das las das las das las das las das las das\n\ndas das das las las las als als als das las als das las als\nlas las las als als als das das das als las das als das las\n\nda all das las da all das las da all das da all das als las\nda all das las da all das las da all das da all das als las\n\nja lös das ja lös das ja lös das ja lös das ja lös da ja da\nja lös das ja lös das ja lös das ja lös das ja lös da ja da\n\nda ja öd fad da ja öd fad da ja öd fad da ja öd fad das las\nda ja öd fad da ja öd fad da ja öd fad da ja öd fad das las\n\nda ja öd da ja öd das lös fad das lös fad da ja öd da ja da\ndas las lös das las lös als das fad als das fad da öl da ja"
},
{
"lesson": 1.3,
"title": "01.3 Schreibsicherheit durch Griffübungen",
"text": "asdf jklö asdf jklö asdf jklö asdf jklö asdf jklö asdf jklö\njklö asdf jklö asdf jklö asdf jklö asdf jklö asdf jklö asdf\n\nölkj fdsa ölkj fdsa ölkj fdsa ölkj fdsa ölkj fdsa ölkj fdsa\nfdsa ölkj fdsa ölkj fdsa ölkj fdsa ölkj fdsa ölkj fdsa ölkj\n\nasdfjklö asdfjklö asdfjklö asdfjklö asdfjklö asdfjklö asdfj\njklöasdf jklöasdf jklöasdf jklöasdf jklöasdf jklöasdf jklöa\n\njfkdlsöa jfkdlsöa jfkdlsöa jfkdlsöa jfkdlsöa jfkdlsöa jfkdl\nöalskdjf öalskdjf öalskdjf öalskdjf öalskdjf öalskdjf öalsk\n\nafa aja ada aka asa ala aöa afa aja ada aka asa ala aöa afa\nöjö öfö ölö ösö ökö ödö öjö öfö ölö ösö ökö ödö öja öfa öka\n\naöaöjö ajaöfö adaölö akaösö asaökö alaödö aöaöjö afaöfö aöj\nöföafa öjöaöa ödöala ököasa ösöaka ölöada öföaja aöfjaö kfj\n\nsla sal sad sla sal sad sla sla sal sad sla sal sad sla sll\nals las das als las das als las das als las das als las das\n\nsad söl aj sad lla ad aj lö sad söl aj sad lla ad aj lö aja\ndas lös ja das all da ja öl das lös ja das all da ja öl das"
},
{
"lesson": 1.4,
"title": "01.4 Lernkontrolle durch Wortübungen",
"text": "ja das las ja das lös ja das las ja das lös ja das las da j\nja das las ja das lös ja das las ja das lös ja das las ja a\n\ndas lös ja all das lös ja all das lös ja all das lös da das\ndas lös ja all das lös ja all das lös ja all das lös da all\n\nja das fad ja das fad ja das fad ja das fad ja das fad da s\nja das fad ja das fad ja das fad ja das fad ja das fad ja f\n\ndas las als all lös fad öd öl da ja das las als all ja da s\ndas las als all lös fad öd öl da ja das las als all ja da l"
},
{
"lesson": 2.1,
"title": "02.1 Erarbeitung der Griffe e und i",
"text": "dede kiki dede kiki dede kiki dede kiki dede kiki dede kiki\ndeki kide deki kide deki kide deki kide deki kide deki kide\n\ndedf kikj deds kikl deda kikö dedf kikj deds kikl deda kikö\ndidf kekj dids kekl dida kekö didf kekj dids kekl dida kekö\n\ndeed kiik deed kiik deed kiik deed kiik deed kiik deed kiik\ndedi kike dedi kike dedi kike dedi kike dedi kike dedi kike\n\ndedkik dedkik dedkik dedkik dedkik dedkik dedkik dedkik ded\njedfik jedfik jedfik jedfik jedfik jedfik jedfik jedfik dfi\n\nella esöl esel edal lede ellaf ella esöl esel edal lede ell\nalle löse lese lade edel falle alle löse lese lade edel all\n\nesöl sella edal sella esel sella edö sella elde lla sad lla\nlöse alles lade alles lese alles öde alles edle all das all"
},
{
"lesson": 2.2,
"title": "02.2 Festigung durch Wortübungen",
"text": "lies dies leise dies sei leise lies dies leise dieses leide\nlies dies leise dies sei leise lies dies leise dieses leide\n\neile leise dieses alles sie lese dieses alles leise sei die\neile leise dieses alles sie lese dieses alles leise sei die\n\nfade öde löse alle falle lasse fade öde löse alle falle sie\nfade öde löse alle falle lasse fade öde löse alle falle sie\n\ndies sei lila fasse das alles löse dies alles dieses sei da\nalles eile jedes lies leise alles eile jedes lies leise all\n\nsei edel das sei edel diese sei edel dieses sei edel sei da\nseid leise dies sei ideal sie lief leise sie fiel leise die"
},
{
"lesson": 2.3,
"title": "Schreibsicherheit durch Griffübungen",
"text": "fdsajklö fdsajklö fdsajklö fdsajklö fdsajklö fdsajklö fdsaj\nölkjasdf ölkjasdf ölkjasdf ölkjasdf ölkjasdf ölkjasdf ölkja\n\nasdedfölkikj asdedfölkikj asdedfölkikj asdedfölkikj asdedfö\njkikölfdedsa jkikölfdedsa jkikölfdedsa jkikölfdedsa jkikölf\n\nadedf ökikj adedf ökikj adedf ökikj adedf ökikj adedf ökikj\njaded fökik jaded fökik jaded fökik jaded fökik jaded fökik\n\njiklö fedsa jiklö fedsa jiklö fedsa jiklö fedsa jiklö fedsa\nölijk asefd ölijk asefd ölijk asefd ölijk asefd ölijk asefd"
},
{
"lesson": 2.4,
"title": "02.4 Lernkontrolle durch Wortübungen",
"text": "seid seid esiel sella ellaf esiel seseid edö alil lede dies\nlies dies leise alles falle leise dieses öde lila edel seid\n\nelie esiel seseid sella eis esel seseid sella esiel eis ies\neile leise dieses alles sie lese dieses alles leise sie sei\n\nedeis ellaf ella esöl edö edaf essal ellaf ella esöl edö ed\nsiede falle alle löse öde fade lasse falle alle löse öde fa\n\nseid dies eile seid dies eile seid dies eile seid dieses ei\nseid dies eile seid dies eile seid dies eile seid dieses ei\n\nes sei dies alles leise es sei dies alles leise es sei dies\nes sei dies alles leise es sei dies alles leise es sei dies\n\nfiel feil fidele feil fiel lief fiel feil fidele feile fiel\nfiel feil fidele feil fiel lief fiel feil fidele feile fiel\n\nsei sie sei die eid die eid alle alles alle alles diese die\nsei sie sei die eid die eid alle alles alle alles diese die\n\nfiel fiel fiel feil feil feil fiel fiel fiel feil feil feil\nlief lief lief eile eile eile lief lief lief eile eile eile"
},
{
"lesson": 3.1,
"title": "03.1 Erarbeitung der beiden Umschalter",
"text": "öÖö öÖö aAa aAa lLl lLl sSs sSs kKk kKk dDd dDd jJj jJj fFf F\nöÖö öÖö aAa aAa lLl lLl sSs sSs kKk kKk dDd dDd jJj jJj fFf F\n\nJa Ja Fö Fö Ka Ka Dö Dö La La Sö Sö Öa Öa Aö Aö Ja Fö Ka Dö L\nJa Ja Fö Fö Ka Ka Dö Dö La La Sö Sö Öa Öa Aö Aö Ja Fö Ka Dö L\n\nöJ aJ aF öF öK aK aD öD öL aL aS öS öA aÖ sA lÖ kA dÖ jA fÖ a\nöJ aJ aF öF öK aK aD öD öL aL aS öS öA aÖ sA lÖ kA dÖ jA fÖ a\n\nJaf Föj Jad Fök Jas Föl Jaa Föö Jaö Föa Jal Fös Jak Föd Ja Fö\nJaf Föj Jad Fök Jas Föl Jaa Föö Jaö Föa Jal Fös Jak Föd Ja Fö\n\nöF aJ döF kaJ söF laJ aöF öaJ ööF aaJ löF saJ köF daJ jöF faJ\nöF aJ döF kaJ söF laJ aöF öaJ ööF aaJ löF saJ köF daJ jöF faJ"
},
{
"lesson": 3.2,
"title": "03.2 Festigung durch Wortübungen",
"text": "Aal Aal Aal Aas Aas Aas Aal Aas Aal Aas Aal Aas Aal Aas Aal A\nAal Aal Aal Aas Aas Aas Aal Aas Aal Aas Aal Aas Aal Aas Aal A\n\nÖle Öle Öle Öde Öde Öde Öle Öde Öle Öde Öle Öde Öle Öde Öle Ö\nÖle Öle Öle Öde Öde Öde Öle Öde Öle Öde Öle Öde Öle Öde Öle Ö\n\nEile Seide Seile Eile Seide Seile Eile Seide Seile Eile Seide\nEile Seide Seile Eile Seide Seile Eile Seide Seile Eile Seide\n\ndie Seide die Eile die Seide die Eile die Seide die Eile Aale\ndie Seide die Eile die Seide die Eile die Seide die Eile Aale\n\ndie Öle die Aale die Öle die Aale die Öle die Aale die Öle Öl\ndie Öle die Aale die Öle die Aale die Öle die Aale die Öle Öl"
},
{
"lesson": 3.3,
"title": "03.3 Schreibsicherheit durch Wortgruppen",
"text": "diese Seide alle Keile des Eides diese Löffel diese Seele\ndiese Seide alle Keile des Eides diese Löffel diese Seele\n\ndiese fidele Liesel dieses ideale Lied Liesa lies das leise\ndiese fidele Liesel dieses ideale Lied Liesa lies das leise\n\ndie Seide dieses Kleides diese Seide des Kleides ideales Ei\ndie Seide dieses Kleides diese Seide des Kleides ideales Ei\n\ndiese ideale Kasse dieses ideale Kleid diese Diele das Eis\ndiese ideale Kasse dieses ideale Kleid diese Diele das Eis\n\ndiese leise Kasse diese Eisdiele diese Eislöffel die Seele\ndiese leise Kasse diese Eisdiele diese Eislöffel die Seele"
},
{
"lesson": 3.4,
"title": "03.4 Lernkontrolle durch Satzübungen",
"text": "Fasse die Seide dieses Kleides Fasse diese Seide des Kleides\nFasse die Seide dieses Kleides Fasse diese Seide des Kleides\n\nLiesel löse leise diese Kaffeelöffel Ja alles ideale Löffel\nLiesel löse leise diese Kaffeelöffel Ja alles ideale Löffel\n\nLiesel lies leise dieses Lied Dieses Lied lies leise Liesel\nLiesel lies leise dieses Lied Dieses Lied lies leise Liesel\n\nLiesel fasse diese Eislöffel Ja Liesel fasse alle Eislöffel\nLiesel fasse diese Eislöffel Ja Liesel fasse alle Eislöffel"
},
{
"lesson": 4.1,
"title": "04.1 Erarbeitung der Griffe g und h",
"text": "asdfgfölkjhj asdfgfölkjhj asdfgfölkjhj asdfgfölkjh asdfgfölkj\nölkjhjasdfgf ölkjhjasdfgf ölkjhjasdfgf ölkjhjasdfg ölkjhasdfg\n\nfgf jhj gfd hjk gfs hjl gfa hjö fgf jhj gfd hjk gfs hjl gfa h\nöhj agf öhk agd öhl ags öhj agf öhk agd öhl ags öhj agf öhk g\n\nhHj gGf hHj gGf Hjh Gfg Hjh gFg Hkl Gds Hlö Gsa Hil Ges HH GG\nHeg Geh Hag Gih Hie Gei Hei Gie Hid Gid Hel Gel Hal Göl Halle"
},
{
"lesson": 4.2,
"title": "04.2 Festigung durch Wortübungen",
"text": "Jagd Jagd Jagd Jagd Jagd Jagd Jagd Jagd Jagd Jagd Jagd Jagd J\nLage Lage Lage Lage Lage Lage Lage Lage Lage Lage Lage Lage L\n\nJagd Lage Jagd Lage Jagd Lage Jagd Lage Jagd Lage Jagd Lage J\nSage Lage Jagd Sage Lage Jagd Sage Lage Jagd Sage Lage Jagd S\n\nhalf Haag sage Sieg sehe Glas gehe Gala sieh Sieg lies Affe H\nsage Agfa half Jagd hege Haff lies Hall gehe Hase sehe Hefe S"
},
{
"lesson": 4.3,
"title": "04.3 Festigung durch Wendungen",
"text": "das Jagdglas die Lage des Jagdglases die Lage dieses Glases\ndas Jagdglas die Lage des Jagdglases die Lage dieses Glases\n\ndie eisige See die eilige Hilfe die öde Höhle die Eisdiele\ndie eisige See die eilige Hilfe die öde Höhle die Eisdiele\n\ndie Lage des Haffes hege diese Aale diese heilige Halle Öl\ndie Lage des Haffes hege diese Aale diese heilige Halle Öl"
},
{
"lesson": 4.4,
"title": "04.4 Lernkontrolle durch Satzübungen",
"text": "Aha da lag ja das Jagdglas Gisela sah die eisige öde Höhle\nAha da lag ja das Jagdglas Gisela sah die eisige öde Höhle\n\nAls Adelheid diese eisige See sah da half sie eilig Gisela\nAls Adelheid diese eisige See sah da half sie eilig Gisela"
},
{
"lesson": 4.5,
"title": "04.5 Sicherheit durch Griffwiederholung = Fingergymnastik",
"text": "jhiikihh jhiikihh jhiikihh jhiikihh jhiikihh jhiikihh jhiikik\nfgeedegg fgeedegg fgeedegg fgeedegg fgeedegg fgeedegg fgeedeg\n\nöikk aedd öikk aedd öikk aedd öikk aedd öikk aedd öikk aedd ö\nlikk sedd likk sedd likk sedd likk sedd likk sedd likk sedd l\n\nkikk dedd kikk dedd kikk dedd kikk dedd kikk dedd kikk dedd k\njikk fedd jikk fedd jikk fedd jikk fedd jikk fedd jikk fedd j\n\naikö öeda aikö öeda aikö öeda aikö öeda aikö öeda aikö öeda a\nsikö leda sikö leda sikö leda sikö leda sikö leda sikö leda s\n\ndikö keda dikö keda dikö keda dikö keda dikö keda dikö keda d\nfikö jeda fikö jeda fikö jeda fikö jeda fikö jeda fikö jeda f\n\nöikklikkkikkjikkaikösiködiköfikö aeddsedddeddfeddöedaledakeda\nehesegalesahekieh ehesegalesahekie ehesegalesahekie ehesegale\n\nsadeleidellehhaseiSffaHsadegaL elhöHedöseidflahseeföHeidegalK\nellaHegiliehsessaHsedelaAeseid giliealesiGeisflahadhaseeSella"
},
{
"lesson": 4.6,
"title": "04.06 Lernkontrolle durch Wortübungen",
"text": "alle See sah das half sie Gisela eilige diese Aale des Hasses\nKlage die Höfe es half diese öde Höhle Lage dies Haff Sie sah\n\nsehe Halle sage Heike helle Höfe öde Höhle die Heide die Haie\nsehe Halle sage Heike helle Höfe öde Höhle die Heide die Haie\n\ngedeihe Klage heikel Heilige fehle Felge eilig Lage lege Igel\ngedeihe Klage heikel Heilige fehle Felge eilig Lage lege Igel"
}
]

View file

@ -1,118 +0,0 @@
[
{
"lesson": 1,
"title": "Grundreihe",
"text": "asdf asdf jklö asdf jklö as df jk lö asdf jklö asdf jklö as df jk lö fj as df jk lö asdf asdf jklö jklö asdf jklö as df jk lö asdf jklö"
},
{
"lesson": 2,
"title": "Kombinationen der Grundreihe",
"text": "as ja sa lö ölä da fj as ja sa lö ölä da fj kalal säda jöla aföl fall eska jass lösa dajf ölja lasa alla ösad fjöl fjöl assa lösa dajf salf jäda löfa söja läsa jäla fjod ölsa"
},
{
"lesson": 3,
"title": "Leichte Wörter",
"text": "Affe Tasche Leute Löwe Fels Saft Jäger Löcher Fassade Tasse Kaffee Löffel Straße Klasse Flosse Raster Sofa Falter Salz Wasser Lager Ölzug Liste Hälfte Saal Krater Jalousie Lösung Läufer Förster Trage Latte Falle Löffel Jalousie Zähler Torte Hölle Futter Hülse"
},
{
"lesson": 4,
"title": "Neue Buchstaben q w e r t z",
"text": "wertz wertz qwertz qwer tz rewe zetra freta treze werte zeter querträt treff werzt zerqt wertet wetzert\nqwertz rewetz werqzreet wertzet zerqwertz trewert zetra wertzqwert rewert zetrewer"
},
{
"lesson": 5,
"title": "Kurze Wörter",
"text": "der die das und ein ist auf zu mit von wie was wir sie du ich ja nein kein am im zum beim dem den des\nwir sind hier und tippen neue texte mit geduld und ruhe lernen wir schnell und sicher"
},
{
"lesson": 6,
"title": "Einfache Sätze",
"text": "Der Hund rennt schnell. Ich trinke gern Wasser. Wir lernen das Zehnfingersystem. Heute ist das Wetter schön. Sie sitzt am kleinen Tisch.\nMein Bruder schreibt eine Mail. Das Kind liest laut. Wir üben jeden Tag fleißig."
},
{
"lesson": 7,
"title": "Umlaute und ß",
"text": "ä ö ü ß Ä Ö Ü über Ölstraße läßt äußere Füße säße Käse, Öl, Maß und süße Früchte.\nEr hält die Tüte am äußeren Sitz. Äußere Räume sind größer. Löse die Aufgabe äußerst genau."
},
{
"lesson": 8,
"title": "Komplexe Wörter",
"text": "Arbeit Erfahrung Geschichte Schreiben Lernen Sprache Gefühl Tastatur Benutzer Geschwindigkeit Finger Training Übung Fehler\nProgrammieren erfordert Geduld und Präzision. Jede Zeile Code verbessert dein Tippgefühl."
},
{
"lesson": 9,
"title": "Kurze Textpassagen",
"text": "Das schnelle Tippen mit zehn Fingern spart viel Zeit. Mit Geduld und Übung wird jeder Tippfehler seltener. Eine gute Haltung und ruhige Atmung helfen beim Lernen.\nBleibe konzentriert, atme ruhig und halte den Blick auf dem Text."
},
{
"lesson": 10,
"title": "Fließtextrealismus",
"text": "Der Morgen begann mit einer Tasse Kaffee und einem neuen Tipptraining. Ich sah auf die Tastatur, legte die Finger auf asdf jklö und begann.\nMit jedem Satz wurde das Tippen flüssiger und leiser. Nach einer Stunde konnte ich meine Gedanken schreiben, ohne auf die Tasten zu sehen."
},
{
"lesson": 11,
"title": "Sonderzeichen und Zahlen",
"text": "@ € % & ( ) ? ! 1 2 3 4 5 6 7 8 9 0 # _ - + = < > [ ] { } / \\ | ^ ~\nMit 100% Einsatz klappt das Tippen bestimmt! Zahlen und Symbole erscheinen oft in Passwörtern und Codefragmenten.\nÜbe sie regelmäßig: (1+2)*3 = 9; printf(\"Summe: %d\", s);"
},
{
"lesson": 12,
"title": "Dialoge",
"text": "\"Guten Morgen!\", sagte Anna. \"Wie geht es dir?\" \"Sehr gut, danke.\" \"Ich übe gerade das Tippen!\"\n\"Das klingt prima!\", meinte Max und lachte. Gemeinsam tippten sie denselben Text. So wurde das Lernen leichter."
},
{
"lesson": 13,
"title": "Redewendungen",
"text": "Übung macht den Meister. Aller Anfang ist schwer. Wer schreibt, der bleibt. Viele Wege führen nach Rom. Steter Tropfen höhlt den Stein.\nLernen durch Wiederholung ist der Schlüssel. Je öfter du einen Text tippst, desto schneller wirst du."
},
{
"lesson": 14,
"title": "Thematische Texte",
"text": "Im Büro stehen mehrere Computer und Tastaturen. Die Mitarbeiter schreiben Berichte und E-Mails. Jeder achtet auf korrekte Groß- und Kleinschreibung.\nIn der Pause reden sie über neue Programme und lernen Tastenkombinationen auswendig."
},
{
"lesson": 15,
"title": "Abschlusstext",
"text": "Nach vielen Übungen kann ich nun schnell und sicher tippen. Fehler sind selten geworden, und das Schreiben macht Spaß.\nTäglich verbessere ich meine Genauigkeit und mache neue Fortschritte. Mit Ruhe, Technik und Konzentration wird jede Tastatur vertrauter."
},
{
"lesson": 16,
"title": "Programmierzeichen",
"text": "` ! @ # $ % ^ & * ( ) - _ = + [ ] { } ; : ' \" < > , . / ? \\ |\nTrainiere diese Zeichen in Verbindung mit Variablen und Klammern: (x+y)*z; var name = 'dev'; const data = { a:1, b:2 };"
},
{
"lesson": 17,
"title": "Python Basics",
"text": "def greet(name):\n\tprint('Hello,', name)\n\nfor i in range(5):\n\tgreet('World')\n\nif __name__ == '__main__':\n \tgreet('Programmer') # Fokus auf : ' ( ) und Einrückung"
},
{
"lesson": 18,
"title": "C-Style Syntax",
"text": "#include <stdio.h>\n\tint main() {\n\tfor(int i = 0; i < 10; i++) {\n\t\tprintf(\"%d\\n\", i);\n\t}\n\treturn 0;\n}// Konzentriere dich auf { } < > und ;"
},
{
"lesson": 19,
"title": "HTML / JavaScript",
"text": "<html>\n<head>\n<title>Test</title></head>\n<body>\n<script>\nfunction add(a, b) {\n\treturn a + b;\n}\nconsole.log(add(2, 3));\n</script>\n</body>\n</html>"
},
{
"lesson": 20,
"title": "JSON Parsing",
"text": "{\n\"user\": \"dev\",\n\"skills\": [\"Python\", \"C++\", \"JSON\"],\n\"active\": true,\n\"projects\": [{\n \"title\": \"Tipptrainer\",\n \"completed\": false\n }]\n} // Beachte Anführungszeichen und Doppelpunkte"
},
{
"lesson": 21,
"title": "Kurze Test Lektion",
"text": "Dies ist nur ein kurzer Text zum Testen."
},
{
"lesson": 22,
"title": "Extra lange Test Lektion",
"text": "Lagebild des Bundeskriminalamts\nBedrohung durch Organisierte Kriminalität bleibt hoch\n\nDrogenhandel, Geldwäsche, Cybercrime - das Ausmaß der Organisierten Kriminalität in Deutschland bleibt laut BKA auf hohem Niveau. Sorge bereitet Ermittlern, dass Kriminelle zunehmend versuchen, Minderjährige für Straftaten zu rekrutieren. Die Bedrohung durch die Organisierte Kriminalität bleibt in Deutschland auf anhaltend hohem Niveau. Das geht aus dem Lagebild für das vergangene Jahr hervor, welches das Bundeskriminalamt (BKA) veröffentlicht hat. Demnach wurde 2024 in insgesamt 647 Verfahren wegen Organisierter Kriminalität ermittelt. Die Zahl bleibt im Vergleich zum Vorjahr nahezu gleich, 2024 stieg sie um fünf Verfahren an. Allerdings ist es der zweithöchste Wert innerhalb von zehn Jahren. Am häufigsten wurde laut BKA in Fällen von Rauschgiftkriminalität ermittelt - mit fast 260 Verfahren machte dieser Bereich den Großteil der Taten der Organisierten Kriminalität aus. Es folgten Fälle von Wirtschaftskriminalität mit etwa 110 Verfahren, Steuer- und Zolldelikte mit rund 60 Verfahren. Ähnlich viele Verfahren wurden wegen Schleuser- und Eigentumskriminalität verfolgt.Einen deutlich geringeren Anteil machten mit vier Prozent aller Verfahren Ermittlungen gegen Cybercrime-Gruppierungen aus. Allerdings ist der durch diese Vergehen entstandene Schaden massiv: Dem Lagebild zufolge wird er auf rund 1,7 Milliarden Euro geschätzt, was mehr als die Hälfte aller durch Organisierte Kriminalität verursachten finanziellen Schäden ausmacht. Insgesamt bezifferte das BKA die Finanzschäden im vergangenen Jahr auf etwa 2,64 Milliarden Euro."
},
{
"lesson": 23,
"title": "Dummy: Leere Lektion",
"text": "Fast leer"
}
]

View file

@ -1,248 +0,0 @@
"""
Unit Tests für ProgressService
"""
import unittest
from unittest.mock import Mock, patch, MagicMock
from datetime import datetime
from services.progress_service import ProgressService
from models import Progress, LessonProgress
class TestProgressService(unittest.TestCase):
"""Tests für die ProgressService-Klasse"""
def setUp(self):
"""Setup für jeden Test"""
self.service = ProgressService()
# ========================
# Global Progress Tests
# ========================
@patch('services.progress_service.Progress')
def test_get_or_create_global_progress_existing(self, mock_progress):
"""Test: Abrufen eines existierenden Progress"""
mock_prog = Mock(spec=Progress)
mock_prog.current_text_index = 5
mock_progress.query.first.return_value = mock_prog
result = ProgressService.get_or_create_global_progress()
self.assertEqual(result, mock_prog)
self.assertEqual(result.current_text_index, 5)
mock_progress.query.first.assert_called_once()
@patch('services.progress_service.db')
@patch('services.progress_service.Progress')
def test_get_or_create_global_progress_create_new(self, mock_progress, mock_db):
"""Test: Erstellen eines neuen Progress wenn keiner existiert"""
mock_progress.query.first.return_value = None
new_progress = Mock(spec=Progress)
mock_progress.return_value = new_progress
result = ProgressService.get_or_create_global_progress()
self.assertEqual(result, new_progress)
mock_db.session.add.assert_called_once_with(new_progress)
mock_db.session.commit.assert_called_once()
@patch('services.progress_service.Progress')
def test_get_current_lesson_index(self, mock_progress):
"""Test: Abrufen des aktuellen Lektionsindex"""
mock_prog = Mock(spec=Progress)
mock_prog.current_text_index = 3
mock_progress.query.first.return_value = mock_prog
result = ProgressService.get_current_lesson_index()
self.assertEqual(result, 3)
@patch('services.progress_service.db')
@patch('services.progress_service.Progress')
def test_set_current_lesson_index(self, mock_progress, mock_db):
"""Test: Setzen des aktuellen Lektionsindex"""
mock_prog = Mock(spec=Progress)
mock_progress.query.first.return_value = mock_prog
ProgressService.set_current_lesson_index(7)
self.assertEqual(mock_prog.current_text_index, 7)
mock_db.session.commit.assert_called_once()
# ========================
# Lesson Progress Tests
# ========================
@patch('services.progress_service.LessonProgress')
def test_get_or_create_lesson_progress_existing(self, mock_lesson_progress):
"""Test: Abrufen eines existierenden LessonProgress"""
mock_progress = Mock(spec=LessonProgress)
mock_progress.current_position = 100
mock_progress.last_text = "test input"
mock_lesson_progress.query.filter_by.return_value.first.return_value = mock_progress
result = ProgressService.get_or_create_lesson_progress(2)
self.assertEqual(result, mock_progress)
self.assertEqual(result.current_position, 100)
mock_lesson_progress.query.filter_by.assert_called_once_with(lesson_index=2)
@patch('services.progress_service.db')
@patch('services.progress_service.LessonProgress')
def test_get_or_create_lesson_progress_create_new(self, mock_lesson_progress, mock_db):
"""Test: Erstellen eines neuen LessonProgress"""
mock_lesson_progress.query.filter_by.return_value.first.return_value = None
new_progress = Mock(spec=LessonProgress)
mock_lesson_progress.return_value = new_progress
result = ProgressService.get_or_create_lesson_progress(5)
mock_lesson_progress.assert_called_once_with(
lesson_index=5,
current_position=0,
last_text="",
total_elapsed_time=0,
key_stroke_count=0,
is_paused=True
)
mock_db.session.add.assert_called_once_with(new_progress)
mock_db.session.commit.assert_called_once()
@patch('services.progress_service.db')
@patch('services.progress_service.LessonProgress')
def test_update_lesson_progress(self, mock_lesson_progress, mock_db):
"""Test: Aktualisieren eines LessonProgress"""
mock_progress = Mock(spec=LessonProgress)
mock_lesson_progress.query.filter_by.return_value.first.return_value = mock_progress
ProgressService.update_lesson_progress(
lesson_index=3,
cursor_position=50,
user_input="hello world",
total_elapsed_time=120500,
key_stroke_count=150,
is_paused=False
)
self.assertEqual(mock_progress.current_position, 50)
self.assertEqual(mock_progress.last_text, "hello world")
self.assertEqual(mock_progress.total_elapsed_time, 120500)
self.assertEqual(mock_progress.key_stroke_count, 150)
self.assertFalse(mock_progress.is_paused)
mock_db.session.commit.assert_called_once()
@patch('services.progress_service.db')
@patch('services.progress_service.LessonProgress')
def test_reset_lesson_progress(self, mock_lesson_progress, mock_db):
"""Test: Zurücksetzen eines LessonProgress"""
mock_progress = Mock(spec=LessonProgress)
mock_lesson_progress.query.filter_by.return_value.first.return_value = mock_progress
ProgressService.reset_lesson_progress(4)
self.assertEqual(mock_progress.current_position, 0)
self.assertEqual(mock_progress.last_text, "")
self.assertEqual(mock_progress.total_elapsed_time, 0)
self.assertEqual(mock_progress.key_stroke_count, 0)
self.assertTrue(mock_progress.is_paused)
mock_db.session.commit.assert_called_once()
@patch('services.progress_service.LessonProgress')
def test_get_lesson_progress_data(self, mock_lesson_progress):
"""Test: Abrufen der Lesson Progress Daten"""
mock_progress = Mock(spec=LessonProgress)
mock_progress.current_position = 75
mock_progress.last_text = "test"
mock_progress.total_elapsed_time = 60.0
mock_progress.key_stroke_count = 80
mock_progress.is_paused = False
mock_lesson_progress.query.filter_by.return_value.first.return_value = mock_progress
result = ProgressService.get_lesson_progress_data(1)
self.assertEqual(result['current_position'], 75)
self.assertEqual(result['last_text'], "test")
self.assertEqual(result['total_elapsed_time'], 60.0)
self.assertEqual(result['key_stroke_count'], 80)
self.assertFalse(result['is_paused'])
@patch('services.progress_service.db')
@patch('services.progress_service.LessonProgress')
def test_get_lesson_progress_data_creates_new_if_not_found(self, mock_lesson_progress, mock_db):
"""Test: get_lesson_progress_data erstellt neuen Eintrag wenn nicht vorhanden"""
# First call returns None, second call returns the new progress
mock_lesson_progress.query.filter_by.return_value.first.side_effect = [None, Mock(
current_position=0,
last_text="",
total_elapsed_time=0,
key_stroke_count=0,
is_paused=True
)]
new_progress = Mock(spec=LessonProgress)
mock_lesson_progress.return_value = new_progress
result = ProgressService.get_lesson_progress_data(99)
# Should create new entry and return default values
self.assertEqual(result['current_position'], 0)
self.assertEqual(result['last_text'], "")
@patch('services.progress_service.db')
@patch('services.progress_service.LessonProgress')
def test_complete_lesson(self, mock_lesson_progress, mock_db):
"""Test: Lektion abschließen"""
mock_progress = Mock(spec=LessonProgress)
mock_lesson_progress.query.filter_by.return_value.first.return_value = mock_progress
ProgressService.complete_lesson(5)
# Sollte Progress zurücksetzen
self.assertEqual(mock_progress.current_position, 0)
self.assertEqual(mock_progress.last_text, "")
self.assertEqual(mock_progress.total_elapsed_time, 0)
self.assertEqual(mock_progress.key_stroke_count, 0)
self.assertTrue(mock_progress.is_paused)
# ========================
# Completion Check Tests
# ========================
def test_check_lesson_completed_true(self):
"""Test: Lektion ist abgeschlossen"""
result = ProgressService.check_lesson_completed(
cursor_position=100,
user_input_length=100,
lesson_text_length=100
)
self.assertTrue(result)
def test_check_lesson_completed_cursor_not_at_end(self):
"""Test: Lektion nicht abgeschlossen - Cursor nicht am Ende"""
result = ProgressService.check_lesson_completed(
cursor_position=50,
user_input_length=100,
lesson_text_length=100
)
self.assertFalse(result)
def test_check_lesson_completed_input_too_short(self):
"""Test: Lektion nicht abgeschlossen - Eingabe zu kurz"""
result = ProgressService.check_lesson_completed(
cursor_position=100,
user_input_length=50,
lesson_text_length=100
)
self.assertFalse(result)
def test_check_lesson_completed_both_incomplete(self):
"""Test: Lektion nicht abgeschlossen - beides unvollständig"""
result = ProgressService.check_lesson_completed(
cursor_position=50,
user_input_length=50,
lesson_text_length=100
)
self.assertFalse(result)
if __name__ == '__main__':
unittest.main()