From 9b1784ba3d7047a23d32daf00745afa6314d1982 Mon Sep 17 00:00:00 2001 From: Mikkel Troels Kongsted Date: Wed, 12 Mar 2025 09:48:24 +0100 Subject: [PATCH] mock server --- mobile/lib/controllers/product.dart | 152 ++---------------- mobile/lib/controllers/receipt.dart | 2 +- mobile/lib/main.dart | 17 +- mobile/lib/pages/all_products_page.dart | 2 +- mobile/lib/pages/all_receipts_page.dart | 2 +- mobile/lib/pages/cart_page.dart | 6 +- mobile/lib/pages/dashboard.dart | 6 +- mobile/lib/pages/finish_shopping_page.dart | 10 +- mobile/lib/pages/home_page.dart | 2 +- mobile/lib/pages/log_in_page.dart | 2 +- mobile/lib/pages/product_location_page.dart | 2 +- mobile/lib/pages/product_page.dart | 4 +- mobile/lib/pages/receipt_page.dart | 2 +- mobile/lib/pages/register_page.dart | 2 +- mobile/lib/pages/settings_page.dart | 2 +- mobile/lib/pages/settings_pages/saldo.dart | 2 +- .../{client.dart => backend_server.dart} | 0 mobile/lib/server/mock_server.dart | 118 ++++++++++++++ mobile/test/widget_test.dart | 2 +- 19 files changed, 160 insertions(+), 175 deletions(-) rename mobile/lib/server/{client.dart => backend_server.dart} (100%) create mode 100644 mobile/lib/server/mock_server.dart diff --git a/mobile/lib/controllers/product.dart b/mobile/lib/controllers/product.dart index b6a138b..c50c1e8 100644 --- a/mobile/lib/controllers/product.dart +++ b/mobile/lib/controllers/product.dart @@ -1,159 +1,27 @@ import 'package:flutter/material.dart'; -import 'package:mobile/models/coordinate.dart'; import 'package:mobile/models/product.dart'; import 'package:mobile/results.dart'; -import 'package:mobile/server/client.dart'; +import 'package:mobile/server/mock_server.dart'; import 'package:mobile/server/server.dart'; class ProductController extends ChangeNotifier { - int _nextId = 0; + final server = MockServer(); + List products = []; String query = ""; ProductController() { - _addAllProducts(); - } - - int getNextId() { - return _nextId++; - } - - get filteredProducts { - if (query.trim().isEmpty) { - return products; - } - return products.where((product) { - final nameLower = product.name.toLowerCase(); - final descriptionLower = product.description.toLowerCase(); - final searchLower = query.toLowerCase(); - - return nameLower.contains(searchLower) || - descriptionLower.contains(searchLower); - }).toList(); - } - - void searchProducts(String query) { - this.query = query; - notifyListeners(); - } - - Result productWithBarcode(String barcode) { - for (var i = 0; i < products.length; i++) { - if (products[i].barcode == barcode) { - return Ok(products[i]); - } - } - return Err("Product with barcode $barcode doesn't exist"); - } - - void _addAllProducts() { - products = [ - Product( - id: _nextId++, - name: "Minimælk", - priceInDkkCents: 1200, - description: "Konventionel minimælk med fedtprocent på 0,4%"), - Product( - id: _nextId++, - name: "Letmælk", - priceInDkkCents: 1300, - description: "Konventionel letmælk med fedtprocent på 1,5%", - location: Coordinate(x: 1800, y: 100)), - Product( - id: _nextId++, - name: "Frilands Øko Supermælk", - priceInDkkCents: 2000, - description: - "Økologisk mælk af frilandskøer med fedtprocent på 3,5%. Ikke homogeniseret eller pasteuriseret. Skaber store muskler og styrker knoglerne 💪"), - Product( - id: _nextId++, - name: "Øko Gulerødder 1 kg", - priceInDkkCents: 1000, - description: ""), - Product( - id: _nextId++, - name: "Øko Agurk", - priceInDkkCents: 1000, - description: ""), - Product( - id: _nextId++, - name: "Æbler 1 kg", - priceInDkkCents: 1000, - description: ""), - Product( - id: _nextId++, - name: "Basmati Ris", - priceInDkkCents: 2000, - description: ""), - Product( - id: _nextId++, - name: "Haribo Mix", - priceInDkkCents: 3000, - description: ""), - Product( - id: _nextId++, name: "Smør", priceInDkkCents: 3000, description: ""), - Product( - id: _nextId++, - name: "Harboe Cola", - priceInDkkCents: 500, - description: ""), - Product( - id: _nextId++, - barcode: "5060337502900", - name: "Monster Energi Drik", - priceInDkkCents: 1500, - description: ""), - Product( - id: _nextId++, - barcode: "5712870659220", - name: "Amper Energi Drik", - priceInDkkCents: 750, - description: ""), - Product( - id: _nextId++, - barcode: "5710326001937", - name: "Danskvand Med Brus", - priceInDkkCents: 500, - description: "Med smag a blåbær"), - Product( - id: _nextId++, - name: "Spaghetti", - priceInDkkCents: 1000, - description: ""), - Product( - id: _nextId++, - name: "Rød Cecil", - priceInDkkCents: 6000, - description: ""), - Product( - id: _nextId++, - name: "Jägermeister 750 ml", - priceInDkkCents: 12000, - description: ""), - Product( - id: _nextId++, - barcode: "5711953068881", - name: "Protein Chokoladedrik", - priceInDkkCents: 1500, - description: "Arla's protein chokolade drik der giver store muskler"), - ]; - } -} - -class ProductControllerByServer extends ChangeNotifier { - final client = BackendServer(); - List products = []; - String query = ""; - ProductControllerByServer() { fetchProductsFromServer(); } Future fetchProductsFromServer() async { - final res = client.allProducts(); - if (res is Error) { - return; + final res = await server.allProducts(); + switch (res) { + case Success>(data: final data): + products = data; + notifyListeners(); + case Error>(): + return; } - products = (res as Success>).data; - notifyListeners(); } get filteredProducts { diff --git a/mobile/lib/controllers/receipt.dart b/mobile/lib/controllers/receipt.dart index f48b87c..54a60cf 100644 --- a/mobile/lib/controllers/receipt.dart +++ b/mobile/lib/controllers/receipt.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:mobile/models/product.dart'; -import 'package:mobile/repos/cart.dart'; +import 'package:mobile/controllers/cart.dart'; class ReceiptController extends ChangeNotifier { int nextId = 0; diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index abe4532..efbf729 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -1,22 +1,21 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:mobile/pages/log_in_page.dart'; -import 'package:mobile/repos/add_to_cart_state.dart'; -import 'package:mobile/repos/cart.dart'; -import 'package:mobile/repos/location_image.dart'; -import 'package:mobile/repos/paying_state.dart'; -import 'package:mobile/repos/product.dart'; -import 'package:mobile/repos/receipt.dart'; -import 'package:mobile/repos/user.dart'; +import 'package:mobile/controllers/add_to_cart_state.dart'; +import 'package:mobile/controllers/cart.dart'; +import 'package:mobile/controllers/location_image.dart'; +import 'package:mobile/controllers/paying_state.dart'; +import 'package:mobile/controllers/product.dart'; +import 'package:mobile/controllers/receipt.dart'; +import 'package:mobile/controllers/user.dart'; import 'package:provider/provider.dart'; -import 'package:mobile/repos/routing.dart'; +import 'package:mobile/controllers/routing.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { - final apiUrl = "10.135.51.114:8080/api"; const MyApp({super.key}); @override diff --git a/mobile/lib/pages/all_products_page.dart b/mobile/lib/pages/all_products_page.dart index 2eb1ee9..0ed3782 100644 --- a/mobile/lib/pages/all_products_page.dart +++ b/mobile/lib/pages/all_products_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:mobile/models/product.dart'; -import 'package:mobile/repos/product.dart'; +import 'package:mobile/controllers/product.dart'; import 'package:mobile/utils/price.dart'; import 'package:mobile/widgets/sized_card.dart'; import 'package:provider/provider.dart'; diff --git a/mobile/lib/pages/all_receipts_page.dart b/mobile/lib/pages/all_receipts_page.dart index 70cfe0c..adf3b5c 100644 --- a/mobile/lib/pages/all_receipts_page.dart +++ b/mobile/lib/pages/all_receipts_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:mobile/pages/receipt_page.dart'; -import 'package:mobile/repos/receipt.dart'; +import 'package:mobile/controllers/receipt.dart'; import 'package:mobile/utils/price.dart'; import 'package:provider/provider.dart'; diff --git a/mobile/lib/pages/cart_page.dart b/mobile/lib/pages/cart_page.dart index 11275fa..9f4a599 100644 --- a/mobile/lib/pages/cart_page.dart +++ b/mobile/lib/pages/cart_page.dart @@ -4,9 +4,9 @@ import 'package:barcode_scan2/platform_wrapper.dart'; import 'package:flutter/material.dart'; import 'package:mobile/models/product.dart'; import 'package:mobile/pages/finish_shopping_page.dart'; -import 'package:mobile/repos/cart.dart'; -import 'package:mobile/repos/product.dart'; -import 'package:mobile/repos/user.dart'; +import 'package:mobile/controllers/cart.dart'; +import 'package:mobile/controllers/product.dart'; +import 'package:mobile/controllers/user.dart'; import 'package:mobile/results.dart'; import 'package:mobile/utils/price.dart'; import 'package:mobile/widgets/primary_button.dart'; diff --git a/mobile/lib/pages/dashboard.dart b/mobile/lib/pages/dashboard.dart index 2af5762..dded58e 100644 --- a/mobile/lib/pages/dashboard.dart +++ b/mobile/lib/pages/dashboard.dart @@ -3,9 +3,9 @@ import 'package:mobile/pages/all_products_page.dart'; import 'package:mobile/pages/cart_page.dart'; import 'package:mobile/pages/all_receipts_page.dart'; import 'package:mobile/pages/home_page.dart'; -import 'package:mobile/repos/routing.dart'; -import 'package:mobile/repos/cart.dart'; -import 'package:mobile/repos/user.dart'; +import 'package:mobile/controllers/routing.dart'; +import 'package:mobile/controllers/cart.dart'; +import 'package:mobile/controllers/user.dart'; import 'package:provider/provider.dart'; class Dashboard extends StatelessWidget { diff --git a/mobile/lib/pages/finish_shopping_page.dart b/mobile/lib/pages/finish_shopping_page.dart index 846b146..16793ea 100644 --- a/mobile/lib/pages/finish_shopping_page.dart +++ b/mobile/lib/pages/finish_shopping_page.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:mobile/repos/routing.dart'; -import 'package:mobile/repos/cart.dart'; -import 'package:mobile/repos/paying_state.dart'; -import 'package:mobile/repos/receipt.dart'; -import 'package:mobile/repos/user.dart'; +import 'package:mobile/controllers/routing.dart'; +import 'package:mobile/controllers/cart.dart'; +import 'package:mobile/controllers/paying_state.dart'; +import 'package:mobile/controllers/receipt.dart'; +import 'package:mobile/controllers/user.dart'; import 'package:mobile/results.dart'; import 'package:mobile/utils/price.dart'; import 'package:mobile/widgets/primary_button.dart'; diff --git a/mobile/lib/pages/home_page.dart b/mobile/lib/pages/home_page.dart index 6809753..b5b2c96 100644 --- a/mobile/lib/pages/home_page.dart +++ b/mobile/lib/pages/home_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:mobile/pages/settings_page.dart'; -import 'package:mobile/repos/user.dart'; +import 'package:mobile/controllers/user.dart'; import 'package:mobile/utils/price.dart'; import 'package:provider/provider.dart'; diff --git a/mobile/lib/pages/log_in_page.dart b/mobile/lib/pages/log_in_page.dart index db8e679..2fac9bb 100644 --- a/mobile/lib/pages/log_in_page.dart +++ b/mobile/lib/pages/log_in_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:mobile/pages/register_page.dart'; -import 'package:mobile/repos/user.dart'; +import 'package:mobile/controllers/user.dart'; import 'package:mobile/results.dart'; import 'package:mobile/widgets/error_box.dart'; import 'package:mobile/widgets/primary_button.dart'; diff --git a/mobile/lib/pages/product_location_page.dart b/mobile/lib/pages/product_location_page.dart index 0d0067f..f437136 100644 --- a/mobile/lib/pages/product_location_page.dart +++ b/mobile/lib/pages/product_location_page.dart @@ -2,7 +2,7 @@ import 'dart:ui' as ui; import 'package:flutter/material.dart'; import 'package:mobile/models/coordinate.dart'; import 'package:mobile/models/product.dart'; -import 'package:mobile/repos/location_image.dart'; +import 'package:mobile/controllers/location_image.dart'; import 'package:provider/provider.dart'; class ProductLocationPage extends StatelessWidget { diff --git a/mobile/lib/pages/product_page.dart b/mobile/lib/pages/product_page.dart index 94039da..c162b12 100644 --- a/mobile/lib/pages/product_page.dart +++ b/mobile/lib/pages/product_page.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:mobile/models/product.dart'; import 'package:mobile/pages/product_location_page.dart'; -import 'package:mobile/repos/add_to_cart_state.dart'; -import 'package:mobile/repos/cart.dart'; +import 'package:mobile/controllers/add_to_cart_state.dart'; +import 'package:mobile/controllers/cart.dart'; import 'package:mobile/utils/price.dart'; import 'package:mobile/widgets/primary_button.dart'; import 'package:provider/provider.dart'; diff --git a/mobile/lib/pages/receipt_page.dart b/mobile/lib/pages/receipt_page.dart index b3a2fce..0225ce5 100644 --- a/mobile/lib/pages/receipt_page.dart +++ b/mobile/lib/pages/receipt_page.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mobile/repos/receipt.dart'; +import 'package:mobile/controllers/receipt.dart'; import 'package:mobile/utils/price.dart'; import 'package:mobile/widgets/receipt_item.dart'; diff --git a/mobile/lib/pages/register_page.dart b/mobile/lib/pages/register_page.dart index de00cd8..27d5ff6 100644 --- a/mobile/lib/pages/register_page.dart +++ b/mobile/lib/pages/register_page.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mobile/repos/user.dart'; +import 'package:mobile/controllers/user.dart'; import 'package:mobile/results.dart'; import 'package:mobile/widgets/error_box.dart'; import 'package:mobile/widgets/primary_button.dart'; diff --git a/mobile/lib/pages/settings_page.dart b/mobile/lib/pages/settings_page.dart index e67e11c..b0cdd6e 100644 --- a/mobile/lib/pages/settings_page.dart +++ b/mobile/lib/pages/settings_page.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:mobile/pages/log_in_page.dart'; import 'package:mobile/pages/settings_pages/saldo.dart'; -import 'package:mobile/repos/user.dart'; +import 'package:mobile/controllers/user.dart'; import 'package:provider/provider.dart'; class _Page { diff --git a/mobile/lib/pages/settings_pages/saldo.dart b/mobile/lib/pages/settings_pages/saldo.dart index dbdbcbc..5704514 100644 --- a/mobile/lib/pages/settings_pages/saldo.dart +++ b/mobile/lib/pages/settings_pages/saldo.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mobile/repos/user.dart'; +import 'package:mobile/controllers/user.dart'; import 'package:mobile/utils/price.dart'; import 'package:provider/provider.dart'; diff --git a/mobile/lib/server/client.dart b/mobile/lib/server/backend_server.dart similarity index 100% rename from mobile/lib/server/client.dart rename to mobile/lib/server/backend_server.dart diff --git a/mobile/lib/server/mock_server.dart b/mobile/lib/server/mock_server.dart new file mode 100644 index 0000000..50359ec --- /dev/null +++ b/mobile/lib/server/mock_server.dart @@ -0,0 +1,118 @@ +import 'package:mobile/models/coordinate.dart'; +import 'package:mobile/models/product.dart'; +import 'package:mobile/server/server.dart'; + +class MockServer implements Server { + @override + Future>> allProducts() async { + var nextId = 0; + return Success(data: [ + Product( + id: nextId++, + name: "Minimælk", + priceInDkkCents: 1200, + description: "Konventionel minimælk med fedtprocent på 0,4%"), + Product( + id: nextId++, + name: "Letmælk", + priceInDkkCents: 1300, + description: "Konventionel letmælk med fedtprocent på 1,5%", + location: Coordinate(x: 1800, y: 100)), + Product( + id: nextId++, + name: "Frilands Øko Supermælk", + priceInDkkCents: 2000, + description: + "Økologisk mælk af frilandskøer med fedtprocent på 3,5%. Ikke homogeniseret eller pasteuriseret. Skaber store muskler og styrker knoglerne 💪"), + Product( + id: nextId++, + name: "Øko Gulerødder 1 kg", + priceInDkkCents: 1000, + description: ""), + Product( + id: nextId++, + name: "Øko Agurk", + priceInDkkCents: 1000, + description: ""), + Product( + id: nextId++, + name: "Æbler 1 kg", + priceInDkkCents: 1000, + description: ""), + Product( + id: nextId++, + name: "Basmati Ris", + priceInDkkCents: 2000, + description: ""), + Product( + id: nextId++, + name: "Haribo Mix", + priceInDkkCents: 3000, + description: ""), + Product( + id: nextId++, name: "Smør", priceInDkkCents: 3000, description: ""), + Product( + id: nextId++, + name: "Harboe Cola", + priceInDkkCents: 500, + description: ""), + Product( + id: nextId++, + barcode: "5060337502900", + name: "Monster Energi Drik", + priceInDkkCents: 1500, + description: ""), + Product( + id: nextId++, + barcode: "5712870659220", + name: "Amper Energi Drik", + priceInDkkCents: 750, + description: ""), + Product( + id: nextId++, + barcode: "5710326001937", + name: "Danskvand Med Brus", + priceInDkkCents: 500, + description: "Med smag a blåbær"), + Product( + id: nextId++, + name: "Spaghetti", + priceInDkkCents: 1000, + description: ""), + Product( + id: nextId++, + name: "Rød Cecil", + priceInDkkCents: 6000, + description: ""), + Product( + id: nextId++, + name: "Jägermeister 750 ml", + priceInDkkCents: 12000, + description: ""), + Product( + id: nextId++, + barcode: "5711953068881", + name: "Protein Chokoladedrik", + priceInDkkCents: 1500, + description: "Arla's protein chokolade drik der giver store muskler"), + ]); + } + + @override + Future> register( + String name, + String email, + String password, + ) async { + return Success(data: null); + } + + @override + Future> login( + String name, + String email, + String password, + ) async { + return Success(data: null); + } +} diff --git a/mobile/test/widget_test.dart b/mobile/test/widget_test.dart index a6b7d51..7258710 100644 --- a/mobile/test/widget_test.dart +++ b/mobile/test/widget_test.dart @@ -13,7 +13,7 @@ import 'package:mobile/main.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); + await tester.pumpWidget(MyApp()); // Verify that our counter starts at 0. expect(find.text('0'), findsOneWidget);