diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f3ae7c75..f2f695a3 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -60,6 +60,7 @@ jobs: invoke import-fixtures invoke server -a 127.0.0.1:12345 & invoke wait + sleep 30 - name: Unit Tests run: | flutter test --coverage diff --git a/lib/api.dart b/lib/api.dart index edb2687b..63f29db6 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -497,7 +497,7 @@ class InvenTreeAPI { /* * Request the user roles (permissions) from the InvenTree server */ - Future getUserRoles() async { + Future getUserRoles() async { roles.clear(); @@ -511,7 +511,7 @@ class InvenTreeAPI { final response = await get(_URL_GET_ROLES, expectedStatusCode: 200); if (!response.successful()) { - return; + return false; } var data = response.asMap(); @@ -519,6 +519,10 @@ class InvenTreeAPI { if (data.containsKey("roles")) { // Save a local copy of the user roles roles = (response.data["roles"] ?? {}) as Map; + + return true; + } else { + return false; } } diff --git a/test/api_test.dart b/test/api_test.dart index 4f9723bd..fdc3ad6a 100644 --- a/test/api_test.dart +++ b/test/api_test.dart @@ -129,10 +129,13 @@ void main() { assert(api.supportsNotifications); assert(api.supportsPoReceive); + // Ensure we can request (and receive) user roles + assert(await api.getUserRoles()); + // Check available permissions assert(api.checkPermission("part", "change")); assert(api.checkPermission("stocklocation", "delete")); - assert(api.checkPermission("part", "weirdpermission")); + assert(!api.checkPermission("part", "weirdpermission")); assert(api.checkPermission("blah", "bloo")); }); diff --git a/test/models_test.dart b/test/models_test.dart new file mode 100644 index 00000000..e3d88140 --- /dev/null +++ b/test/models_test.dart @@ -0,0 +1,143 @@ +/* + * Unit tests for accessing various model classes via the API + */ + +import "package:inventree/inventree/model.dart"; +import "package:test/test.dart"; + +import "package:inventree/api.dart"; +import "package:inventree/user_profile.dart"; +import "package:inventree/inventree/part.dart"; + + +void main() { + + setUp(() async { + await UserProfileDBManager().addProfile(UserProfile( + name: "Test Profile", + server: "http://localhost:12345", + username: "testuser", + password: "testpassword", + selected: true, + )); + + assert(await UserProfileDBManager().selectProfileByName("Test Profile")); + assert(await InvenTreeAPI().connectToServer()); + }); + + group("Category Tests:", () { + test("Basics", () async { + assert(InvenTreePartCategory().URL == "part/category/"); + }); + + test("List Categories", () async { + List results; + + // List *all* categories + results = await InvenTreePartCategory().list(); + assert(results.length == 8); + + for (var result in results) { + assert(result is InvenTreePartCategory); + } + + // Filter by parent category + results = await InvenTreePartCategory().list( + filters: { + "parent": "1", + } + ); + + assert(results.length == 3); + }); + }); + + group("Part Tests:", () { + + test("Basics", () async { + assert(InvenTreePart().URL == "part/"); + }); + + test("List Parts", () async { + List results; + + // List *all* parts + results = await InvenTreePart().list(); + assert(results.length == 13); + + for (var result in results) { + // results must be InvenTreePart instances + assert(result is InvenTreePart); + } + + // Filter by category + results = await InvenTreePart().list( + filters: { + "category": "2", + } + ); + + assert(results.length == 2); + }); + + test("Part Detail", () async { + final result = await InvenTreePart().get(1); + + assert(result != null); + assert(result is InvenTreePart); + + if (result != null) { + InvenTreePart part = result as InvenTreePart; + + // Check some basic properties of the part + assert(part.name == "M2x4 LPHS"); + assert(part.fullname == "M2x4 LPHS"); + assert(part.description == "M2x4 low profile head screw"); + assert(part.categoryId == 8); + assert(part.categoryName == "Fasteners"); + assert(part.image == part.thumbnail); + assert(part.thumbnail == "/static/img/blank_image.thumbnail.png"); + + // Stock information + assert(part.unallocatedStockString == "9000"); + assert(part.inStockString == "9000"); + } + + }); + + test("Part Adjust", () async { + // Test that we can update part data + final result = await InvenTreePart().get(1); + + assert(result != null); + assert(result is InvenTreePart); + + if (result != null) { + InvenTreePart part = result as InvenTreePart; + assert(part.name == "M2x4 LPHS"); + + // Change the name to something else + assert(await part.update( + values: { + "name": "Woogle", + } + )); + + assert(await part.reload()); + assert(part.name == "Woogle"); + + // And change it back again + assert(await part.update( + values: { + "name": "M2x4 LPHS" + } + )); + + assert(await part.reload()); + assert(part.name == "M2x4 LPHS"); + } + }); + + }); + +} \ No newline at end of file