Was haben wir die letzten Tage gemacht? Wo fangen wir an?
Vielleicht auf der UI-Seite
Schon im letzten Sprint haben wir Coding aufgeräumt und Schnittstellen standardisiert. Damit haben wir auch diese Tage weitergemacht. Spez. bei der Verwendung von Images. In der App werden bisher zwei Formate verwendet, um den Zugriff auf Images zu ermöglichen.
- Einerseits Uri-Objekte, die auf ein Image verweisen
- Andererseits ein Objekt vom Typ IImage, das wir eingeführt haben
IImage besitzt ein Property ImageSource, womit auf das Bild selbst zugegriffen werden kann. Die ImageSource kann entweder ein Bitmap, eine Android Resource oder ein Uri-Objekt sein.
Da ImageSource das erste Format – Objekte vom Typ Uri – unterstützt, haben wir nun jeglichen Zugriff auf unser IImage umgestellt.
Soweit so gut.
Ein zweites größeres Thema im Sprint waren Unittests, die wir etwas weiter forcieren wollen. Bspw. auch für Änderungen an Klassen für die Verarbeitung von Bildern, die wir nun umgestellt haben. Und voila es hat nicht alles funktioniert :D.
Trotz Einsatz von Mockito konnten nicht alle Fälle zum Testen abgedeckt werden. Denn bei Verwendung von Uri-Objekten haben wir auf statische Funktionen (Uri.Parse()) zugegriffen, die in den zu testenden Klassen aufgerufen wurden. Die Uri-Klasse hat sogar noch eine Fehlermeldung aller: „ist beim Testen zu mocken“, bei der Ausführung der betroffenen Tests ausgegeben.
Außerdem verwenden wir Extensions (String.toUri()), die wir nicht durch andere Aufrufe ersetzen wollen.
Also musste eine andere Lösung her. Mockk sollte es sein, ein Mocking-Framework, das speziell für die Verwendung in Kotlin zugeschnitten ist. Und man muss sagen, es funktioniert großartig. Anfangs gab es ein paar Schwierigkeiten die richtige Dependency zu laden, aber letztendlich ist das Coding deutlich lesbarer als bei der Verwendung von Mockito, das Mocken von statischem Code ist möglich und auch Extensions können gemockt werden. Hier ein kleines Beispiel:
Vielleicht ein paar Erklärungen dazu:
Die Klasse Uri stellt die Extension „toUri“ für die Klasse String bereit. Damit können Objekte vom Typ String automatisch in eine Uri umgewandelt werden. Extensions sind statisches Coding, das bspw. mit Mockito nicht einfach getestet werden kann.
Über Mockk ist das über die Funktion „mockkStatic“ möglich. Es muss lediglich die Klasse übergeben werden, auf der die Extension implementiert ist.
In der zweiten Zeile wird ein zweites Mock-Objekt vom Typ Uri erstellt.
In der darauffolgenden Zeile wird das erwartete Verhalten des Mocks beim Aufruf der Extension „toUri“ festgelegt. Immer wenn für einen String (hier uriString) die Extension „toUri“ aufgerufen wird, soll das zuvor gemockte Objekt uri zurückgegeben werden.
Anschließend erfolgt der zu testende Funktionsaufruf und abschließend wird durch die Funktion verify überprüft, ob „toUri“ aufgerufen wurde. Die Überprüfungen können auch deutlicher vielfältiger und komplexer sein. Eine Übersicht der meisten Features findet man in der Reihe Mocking is not rocket science und ganz konkrete Details in der zugehörigen Doku.
Dank mockk konnten auch die bestehenden Unittests, die Zugriff auf den Android Context benötigen, umgezogen werden. Vielleicht hätten wir das auch bereits im Vorfeld mit Mockito machen können. Test mit spez. Bezug zu Android wollen wir so gering wie möglich halten.
Um mit mockk etwas zu arbeiten, sind noch für ein paar zusätzliche Klassen Unittests rausgepurzelt und Dokumentationen spez. für Interfaces ergänzt worden.
Das Fass ohne Boden
Das zweite große Thema war Keycloak, OAuth2 und die Möglichkeit serverseitig ausgeloggte Benutzer den Zugriff auf Endpunkte des Webservers zu verwehren.
Bisher ist es so: Wenn ein User seinen JWT (JSON Web Token) hat, dann kann er munter auf Endpunkte des Resource-Servers zugreifen, auch wenn der User bereits in Keycloak ausgeloggt wurde.
Was uns fehlt ist generell eine Verbindung zwischen unserem Webserver (Resource-Server) und Keycloak.
Die Idee ist also zu prüfen, ob ein Token noch gültig ist. Bisher validieren wir den Token lediglich auf Webserver-Seite. Dank OAuth2 Spezifikation ist das Theme Validierung von Tokens bereits vorgesehen. Es gibt einen speziellen Endpunkt „introspect“.
Warum also nicht diesen Endpunkt in Keycloak aufrufen, den User-Token zur Prüfung übergeben und abhängig vom Ergebnis, ob der Token gültig ist oder nicht den Zugriff auf die jeweilige Resource (bspw. alle Teams auslesen) ermöglichen?
Letztendlich scheint es, als ob unser Keycloak-System dafür noch nicht konfiguriert ist. Die Tests wurden mit Postman durchgeführt, aber das Ergebnis waren Fehler wie: „invalid_client_credentials“ oder „invalid_request – Authentication failed“.
Zur Authentication kann im Grunde entweder ein Bearer-Token oder eine Basic-Authentification (User Credentials) verwendet werden. Aber weder mit dem Admin-User, noch einem aktuellen Bearer-Token und auch nicht mit Client-Id / Client Secret hat es funktioniert. Später ist aufgefallen, dass die Einstellung des Clients möglicherweise gar nicht korrekt ist.
Kurz: es scheint, als hätten wir das Fass ohne Boden wieder aufgemacht. Denn an Keycloak, OAuth und alles was damit zutun hat, haben wir schon viel Zeit verbracht.
Aber das bekommen wir auch in den Griff.
Das war es für diese Woche.