diff --git a/FabAccessAPI/FabAccessAPI.csproj b/FabAccessAPI/FabAccessAPI.csproj index 39926f3..87ed430 100644 --- a/FabAccessAPI/FabAccessAPI.csproj +++ b/FabAccessAPI/FabAccessAPI.csproj @@ -6,6 +6,10 @@ enable + + + + diff --git a/FabAccessAPI/schema b/FabAccessAPI/schema index 158d307..9d7c66b 160000 --- a/FabAccessAPI/schema +++ b/FabAccessAPI/schema @@ -1 +1 @@ -Subproject commit 158d307d74a8e82d5b7c9f4de1afcb180cc6eceb +Subproject commit 9d7c66b9dd5d5245f21cb14c5d09de99954951e7 diff --git a/FabAccessAPI_Test/API_SpecTests/ResourceTest.cs b/FabAccessAPI_Test/API_SpecTests/ResourceTest.cs new file mode 100644 index 0000000..ffe348b --- /dev/null +++ b/FabAccessAPI_Test/API_SpecTests/ResourceTest.cs @@ -0,0 +1,101 @@ +using FabAccessAPI; +using FabAccessAPI.Schema; +using NLog.Time; +using NUnit.Framework; + +namespace FabAccessAPI_Test; + +[TestFixture] +public class ResourceTest +{ + [Test(Description="TestID: 00001")] + [TestCase("UserA", "MachineA")] + public async Task Claim(string username, string resourcename) + { + API api = new API(); + ConnectionData connectionData = TestEnv.CreateConnetionData(username); + await api.Connect(connectionData).ConfigureAwait(false); + + Resource resource = await api.Session.Resources.GetByName(resourcename).ConfigureAwait(false); + Fallible result = await resource.Claim.Claim().ConfigureAwait(false); + + // TODO: Claim Error State in Case of Success + + IClaim claim = result.Ok; + + // TODO: Change State + + await claim.Disown().ConfigureAwait(false); + + await api.Disconnect().ConfigureAwait(false); + } + + [TestCase("UserA", "fabaccess://test.fab-access.space/resources/MachineA")] + public async Task GetByUrl(string username, string resourceURN) + { + API api = new API(); + ConnectionData connectionData = TestEnv.CreateConnetionData(username); + await api.Connect(connectionData).ConfigureAwait(false); + + Resource resource = await api.Session.Resources.GetByUrl(resourceURL).ConfigureAwait(false); + + Assert.That(resource, Is.Not.Null); + + await api.Disconnect().ConfigureAwait(false); + } + + [TestCase("UserA", "urn:fabaccess:resource:MachineA")] + public async Task GetByUrn(string username, string resourceURN) + { + API api = new API(); + ConnectionData connectionData = TestEnv.CreateConnetionData(username); + await api.Connect(connectionData); + + Resource resource = await api.Session.Resources.GetByUrn(resourceURN).ConfigureAwait(false); + + await api.Disconnect().ConfigureAwait(false); + } + + [TestCase("UserA")] + public async Task List(string username) + { + API api = new API(); + ConnectionData connectionData = TestEnv.CreateConnetionData(username); + await api.Connect(connectionData).ConfigureAwait(false); + + IReadOnlyList result = await api.Session.Resources.List().ConfigureAwait(false); + + await api.Disconnect().ConfigureAwait(false); + } + + [TestCase("UserA")] + public async Task Claimed(string username) + { + API api = new API(); + ConnectionData connectionData = TestEnv.CreateConnetionData(username); + await api.Connect(connectionData).ConfigureAwait(false); + + IReadOnlyList result = await api.Session.Resources.Claimed().ConfigureAwait(false); + + await api.Disconnect().ConfigureAwait(false); + } + + [TestCase("UserA", "MachineA")] + public async Task ClaimedListCheck(string username, string resourcename) + { + API api = new API(); + ConnectionData connectionData = TestEnv.CreateConnetionData(username); + await api.Connect(connectionData).ConfigureAwait(false); + + IReadOnlyList result1 = await api.Session.Resources.Claimed().ConfigureAwait(false); + Assert.That(result1.Count, Is.Zero); + + Resource machineA = await api.Session.Resources.GetByName(resourcename).ConfigureAwait(false); + IClaim claim = (await machineA.Claim.Claim().ConfigureAwait(false)).Ok; + + IReadOnlyList result2 = await api.Session.Resources.Claimed().ConfigureAwait(false); + Assert.That(result2.Count, Is.Not.Zero); + + await api.Disconnect().ConfigureAwait(false); + } +} diff --git a/usecase.md b/usecase.md index 58c2204..8309622 100644 --- a/usecase.md +++ b/usecase.md @@ -6,15 +6,15 @@ Use Cases + UserA - generischer User + UserB - generischer User mit gleichen Rollen wir UserA + UserC - generischer User ohne Rollen -+ MaschineA - frei zugängliche Resource mit festem Ort und Stromanschluss -+ TerminalA - NFC Reader bei MaschineA, welche nur MaschinA nutzen kann -+ RolleB - Rolle mit Berechtigungen MaschineB zu nutzen -+ MaschineB - beschränkt zugängliche Resource mit festem Ort und Stromanschluss -+ TerminalB - NFC Reader bei MaschineA, welche nur MaschineB mit PIN nutzen kann -+ TerminalB - NFC Reader bei MaschineA, welche nur MaschinB mit PIN nutzen kann -+ MaschineC - frei zugängliche Resource mit festem Ort und Stromanschluss, benötigt MaschineD zum funktionieren -+ MaschineD - Maschine mit welche von MaschineC gebraucht wird -+ MaschineE - Maschine, welche von meheren Nutzer gleichzeitig verwendet werden kann ++ MachineA - frei zugängliche Resource mit festem Ort und Stromanschluss ++ TerminalA - NFC Reader bei MachineA, welche nur MaschinA nutzen kann ++ RolleB - Rolle mit Berechtigungen MachineB zu nutzen ++ MachineB - beschränkt zugängliche Resource mit festem Ort und Stromanschluss ++ TerminalB - NFC Reader bei MachineA, welche nur MachineB mit PIN nutzen kann ++ TerminalB - NFC Reader bei MachineA, welche nur MaschinB mit PIN nutzen kann ++ MachineC - frei zugängliche Resource mit festem Ort und Stromanschluss, benötigt MachineD zum funktionieren ++ MachineD - Maschine mit welche von MachineC gebraucht wird ++ MachineE - Maschine, welche von meheren Nutzer gleichzeitig verwendet werden kann + ManagerA - User mit Berechtigung zum Verwalten von Usern und Vergeben von Berechtigungen + UserB + CardA - FabFireCard von UserA @@ -60,55 +60,55 @@ Borepin holt ein Token für die zukünftige Anmeldung des Gerätes *User0 kann nun Resourcen ausleihen* ## Rollenvergabe -*UserA möchte MaschineB verwenden können* +*UserA möchte MachineB verwenden können* -UserA geht zu ManagerA und erhält eine Einweisung für MaschineB +UserA geht zu ManagerA und erhält eine Einweisung für MachineB ManagerA öffnet Borepin, wird automatisch angemeldet und + öffnet die Nutzerverwaltung + wählt UserA aus + fügt UserA RolleB zu -*UserA kann nun Borepin öffnen, wird automatisch angemeldet und kann MaschineB nutzten* +*UserA kann nun Borepin öffnen, wird automatisch angemeldet und kann MachineB nutzten* -## Claim -*UserA steht vor MaschineA und möchte diese verwenden* +## Claim - TestID:00001 +*UserA steht vor MachineA und möchte diese verwenden* UserA öffnet Borepin, wird automatisch angemeldet und -+ wählt MaschineA in einer Liste aus / scannt den QR-Code von MaschineA / scannt den NTAG von MaschineA -+ leiht MaschineA aus -+ schaltet den Strom von MaschineA frei -+ verwendet MaschineA -+ gibt MaschineA zurück, Strom wird gesperrt vom BFFH ++ wählt MachineA in einer Liste aus / scannt den QR-Code von MachineA / scannt den NTAG von MachineA ++ leiht MachineA aus ++ schaltet den Strom von MachineA frei ++ verwendet MachineA ++ gibt MachineA zurück, Strom wird gesperrt vom BFFH -*UserA hat MaschineA verwendet* +*UserA hat MachineA verwendet* ## Transfer -*UserA möchte UserB die MaschineB übergeben* +*UserA möchte UserB die MachineB übergeben* -UserA hatte MaschineB ausgeliehen, öffnet Borepin, wird automatisch angemeldet und -+ wählt MaschineA in einer Liste aus / scannt den QR-Code von MaschineA / scannt den NTAG von MaschineA +UserA hatte MachineB ausgeliehen, öffnet Borepin, wird automatisch angemeldet und ++ wählt MachineA in einer Liste aus / scannt den QR-Code von MachineA / scannt den NTAG von MachineA + generiet ein Transfer QR-Code / emuliert eine Transfer NTAG UserB öffnet Borepin, wird automatisch angemeldet und + scannt Transfer QR-Code / scannt Transfer NTAG -*UserB kann nun MaschineB verwenden, ohne das der Zustand der Maschine sich verändet hat* +*UserB kann nun MachineB verwenden, ohne das der Zustand der Maschine sich verändet hat* ## Lend/Instruct -*UserA möchte UserC an MaschineB ausbilden* +*UserA möchte UserC an MachineB ausbilden* -UserA hatte MaschineB ausgeliehen, öffnet Borepin, wird automatisch angemeldet und -+ wählt MaschineA in einer Liste aus / scannt den QR-Code von MaschineA / scannt den NTAG von MaschineA +UserA hatte MachineB ausgeliehen, öffnet Borepin, wird automatisch angemeldet und ++ wählt MachineA in einer Liste aus / scannt den QR-Code von MachineA / scannt den NTAG von MachineA + generiet ein Lend QR-Code / emuliert eine Lend NTAG UserC öffnet Borepin, wird automatisch angemeldet und + scannt Lend QR-Code / scannt Lend NTAG -+ verwendet MaschineB -+ gibt MaschineB zurück ++ verwendet MachineB ++ gibt MachineB zurück -UserA erhält MaschineB zurück, prüft MaschineB, gibt MaschineB zurück +UserA erhält MachineB zurück, prüft MachineB, gibt MachineB zurück -*UserC hat MaschineB verwendet, unter Verantwortung von UserA* +*UserC hat MachineB verwendet, unter Verantwortung von UserA* ## FabFireCard Erzeugung *UserA geht zu ManagerA und möchte ein FabFireCard erhalten* @@ -160,25 +160,25 @@ __Gleiches Verhalten wie bei Accounterzeugung__ *UserA hat sein Passwort zurückgesetzt* ## Terminalnutzung -*UserA möchte MaschineA mit CardA ausleihen* +*UserA möchte MachineA mit CardA ausleihen* UserA steht vor TerminalA und + hält CardA auf den NFC Reader TerminalA meldet sich bei BFFH und -+ leiht MaschineA für UserA aus ++ leiht MachineA für UserA aus + schaltet den Strom frei UserA steht vor TerminalA und -+ gibt auf TerminalA ein, MaschineA zurückgeben ++ gibt auf TerminalA ein, MachineA zurückgeben oder UserA öffnet Borepin, wird automatisch angemeldet und + gibt MaschinA zurück -*UserA hat MaschineA mit CardA ausgeliehen und verwendet* +*UserA hat MachineA mit CardA ausgeliehen und verwendet* ## Terminalnutzung mit PIN -*UserA möchte MaschineB mit CardA ausleihen* +*UserA möchte MachineB mit CardA ausleihen* UserA steht vor TerminalB und + hält CardA auf den NFC Reader @@ -186,20 +186,20 @@ UserA steht vor TerminalB und + tippt PIN ein TerminalB meldet sich bei BFFH und -+ leiht MaschineB für UserA aus ++ leiht MachineB für UserA aus + schaltet den Strom frei __Gleiches Verhalten wie bei Accounterzeugung__ -*UserA hat MaschineA mit CardA ausgeliehen und verwendet* +*UserA hat MachineA mit CardA ausgeliehen und verwendet* ## Reservieren -*UserA möchte für morgen MaschineA reservieren* +*UserA möchte für morgen MachineA reservieren* UserA öffnet Borepin, wird automatisch angemeldet und -+ wählt MaschineA aus Liste aus ++ wählt MachineA aus Liste aus + geht auf reservieren und trägt ein Zeitraum ein --> UserA erhält zum Begin der Reservierung automatisch den Claim für die MaschineA, wenn dieser verfügbar ist +-> UserA erhält zum Begin der Reservierung automatisch den Claim für die MachineA, wenn dieser verfügbar ist oder @@ -208,55 +208,55 @@ oder UserA geht zu ManagerA und bittet ihn die Maschine freizugeben ManagerA öffnet Borepin, wird automatisch angemeldet und -+ wählt MaschineA aus Liste aus ++ wählt MachineA aus Liste aus + entfernt den Claim --> UserA erhält automatisch den Claim für MaschineA -*UserA kann MaschineA im Reservierungszeitraum nutzen* +-> UserA erhält automatisch den Claim für MachineA +*UserA kann MachineA im Reservierungszeitraum nutzen* ## Queuing -*UserB verwendet gerade MaschineA und UserA möchte als nächster an MaschineA* +*UserB verwendet gerade MachineA und UserA möchte als nächster an MachineA* UserA öffnet Borepin, wird automatisch angemeldet und -+ wählt MaschineA aus Liste aus ++ wählt MachineA aus Liste aus + geht auf queuing -UserB gibt MaschineA zurück --> UserA erhält automatisch ein Claim auf MaschineA -*UserA kann direkt nach UserB MaschineA nutzen* +UserB gibt MachineA zurück +-> UserA erhält automatisch ein Claim auf MachineA +*UserA kann direkt nach UserB MachineA nutzen* ## Intereset/Reservierung/Queuing aufhebn -*UserA hat einen Interest auf MaschineA* +*UserA hat einen Interest auf MachineA* UserA öffnet Borepin, wird automatisch angemeldet und -+ wählt MaschineA aus Liste aus ++ wählt MachineA aus Liste aus + beendet Interest -*UserA hat jetzt keinen Interest auf MaschineA* +*UserA hat jetzt keinen Interest auf MachineA* ## Benachrichten -*UserA möchte wissen wann die MaschineA frei ist* +*UserA möchte wissen wann die MachineA frei ist* UserA öffnet Borepin, wird automatisch angemeldet und -+ wählt MaschineA aus Liste aus -+ aktiviert Benachrichtigungen für MaschineA (mit Optionen, um welchen State es geht) ++ wählt MachineA aus Liste aus ++ aktiviert Benachrichtigungen für MachineA (mit Optionen, um welchen State es geht) --> BFFH benachrichtigt UserA, dass die MaschineA frei ist +-> BFFH benachrichtigt UserA, dass die MachineA frei ist -> Noftiy wird wieder gelöscht oder --> BFFH benachrichtigt UserA, dass die MaschineA frei ist +-> BFFH benachrichtigt UserA, dass die MachineA frei ist UserA öffnet Borepin, wird automatisch angemeldet und -+ wählt MaschineA aus Liste aus -+ deaktiviert Benachrichtigungen für MaschineA ++ wählt MachineA aus Liste aus ++ deaktiviert Benachrichtigungen für MachineA -*UserA wurde über Änderungen von MaschineA benachrichtigt* +*UserA wurde über Änderungen von MachineA benachrichtigt* ## Abhängige Maschinen -*UserA möchte MaschineC ausleihen* +*UserA möchte MachineC ausleihen* serA öffnet Borepin, wird automatisch angemeldet und -+ wählt MaschineA aus Liste aus -+ claimed MaschineA --> MaschineD wird von BFFH geclaimed ++ wählt MachineA aus Liste aus ++ claimed MachineA +-> MachineD wird von BFFH geclaimed ## Kaputte Maschine melden