From cfb3311c3474c77e8e5a8cb7cfd9e55b144b10e8 Mon Sep 17 00:00:00 2001 From: Jan Heise Date: Tue, 19 Apr 2022 11:52:13 +0200 Subject: [PATCH] basic challenge done Signed-off-by: Jan Heise --- README.md | 11 +++++++++++ challenge.py | 24 ++++++++++++++++++++--- test/data/accept.xml | 3 +++ test/test_404_event_cam.py | 19 ------------------ test/test_accept.py | 40 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 22 deletions(-) create mode 100644 test/data/accept.xml delete mode 100644 test/test_404_event_cam.py create mode 100644 test/test_accept.py diff --git a/README.md b/README.md index d709f3d..d7a8374 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,15 @@ Challenge ========= +Ziel ist es, die Adapter-Klasse in challenge.py zu implementieren. Diese hat 2 nicht +implementierte Methoden, eine synchron, eine asynchron, die beide einen String mit +einem JSON-Object zurückgeben sollen. + +Synchron sollte recht simpel umzusetzen gehen, für asynchron ist ein wenig Verständnis +für twisted.internet notwendig. Spannendes Framework, macht aber seinem Namen oft alle +Ehre. + +Test-Verifikation via *nosetest3*. + +Viel Spaß. Wir freuen uns auf interessante Lösungen. diff --git a/challenge.py b/challenge.py index ac6506b..3a91653 100644 --- a/challenge.py +++ b/challenge.py @@ -3,11 +3,29 @@ class Adapter(): """ Adapter class - Aufgabe: Asynchron Daten lesen, konvertieren und zurückliefern. + Aufgabe: Asynchron XML-Daten lesen, konvertieren und zurückliefern. """ def __init__(self, path): self.path = path - def retrieve_json(self, name): - pass + def retrieve_token(self, name): + """ + Retrieve the content from file name.xml in adapters path directory + in a synchronous way, extract the DataReceived/Token and return it + as a JSON-Object (stringified) '{"token": value}'. + """ + raise NotImplementedError + + def retrieve_token_async(self, name): + """ + Retrieve the content from file name.xml in adapters path directory + in an asynchronous way, extract the DataReceived/Token and return it + as a Deferred which ends up in a JSON-Object (as above). + + see: https://twistedmatrix.com/documents/8.0.0/api/twisted.internet.defer.Deferred.html + + Hint: The simple way is to use defer.succeed(), bonus points for doing + it with a callback chain read->parse->convert. + """ + raise NotImplementedError diff --git a/test/data/accept.xml b/test/data/accept.xml new file mode 100644 index 0000000..0adc1d2 --- /dev/null +++ b/test/data/accept.xml @@ -0,0 +1,3 @@ + + 42 + diff --git a/test/test_404_event_cam.py b/test/test_404_event_cam.py deleted file mode 100644 index 446ce9f..0000000 --- a/test/test_404_event_cam.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Acceptance Test -~~~~~~~~~~~~~~~ - -:Ablauf: - - Adapter wird erzeugt - - Daten werden angefordert - -:Erwartetes Ergebnis: - - Daten sind korrekt -""" -from nose.tools import assert_equals -from .. import Adapter - -def test_acceptance(): - """ Acceptance Test """ - - adapter = Adapter diff --git a/test/test_accept.py b/test/test_accept.py new file mode 100644 index 0000000..1073ace --- /dev/null +++ b/test/test_accept.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +""" +Acceptance Test +~~~~~~~~~~~~~~~ + +:Ablauf: + - Adapter wird erzeugt + - Daten werden angefordert + +:Erwartetes Ergebnis: + - Daten sind korrekt +""" +from nose.twistedtools import reactor, deferred +from nose.tools import assert_equals +from twisted.internet.defer import Deferred +from .data import TEST_DATA_DIR +from .. import Adapter + +def test_acceptance(): + """ Acceptance test (synchron) """ + + adapter = Adapter(TEST_DATA_DIR) + data = adapter.retrieve_token("accept") + assert_equals(data, '{"token": 42}') + + +@deferred(timeout=2.0) +def test_acceptance_async(): + """ Acceptance test (asynchron) """ + + adapter = Adapter(TEST_DATA_DIR) + finish = Deferred() + defer = adapter.retrieve_token_async("accept") + + def check(data): + assert_equals(data, '{"token": 42}') + finish.callback(None) + defer.addCallback(check) + + return finish