diff --git a/lib/src/pages/home/profile.dart b/lib/src/pages/home/profile.dart index 0f6e034059..4433f3d8c0 100644 --- a/lib/src/pages/home/profile.dart +++ b/lib/src/pages/home/profile.dart @@ -1,4 +1,5 @@ import 'package:blt/src/pages/home/home_imports.dart'; +import 'package:http/http.dart' as http; /// Page that displays the stats of a user registered on BLT, /// shows dummy data for Guest login. @@ -27,8 +28,10 @@ class _UserProfileState extends ConsumerState { Future?> getAnonymousUserIssueList() async { List? issueList = null; + final client = http.Client(); try { final IssueData? issueData = await IssueApiClient.getAllIssues( + client, IssueEndPoints.issues, ); issueList = issueData!.issueList; diff --git a/lib/src/pages/leaderboards/global_leaderboard.dart b/lib/src/pages/leaderboards/global_leaderboard.dart index daf8e07445..96785ba0a3 100644 --- a/lib/src/pages/leaderboards/global_leaderboard.dart +++ b/lib/src/pages/leaderboards/global_leaderboard.dart @@ -1,6 +1,7 @@ import 'package:blt/src/pages/leaderboards/leaderboards_imports.dart'; import 'package:flutter/material.dart'; import 'dart:async'; +import 'package:http/http.dart' as http; /// Page showing the all time top contributing users. class GlobalLeaderBoardPage extends StatefulWidget { @@ -16,7 +17,7 @@ class _GlobalLeaderBoardPageState extends State { @override void initState() { var paginatedUrl = LeaderboardEndpoints.globalLeaderboard; - _getObj = LeaderboardApiClient.getLeaderData(paginatedUrl); + _getObj = LeaderboardApiClient.getLeaderData(http.Client(), paginatedUrl); super.initState(); } diff --git a/lib/src/providers/authstate_provider.dart b/lib/src/providers/authstate_provider.dart index 05161e147b..92a8bddf3b 100644 --- a/lib/src/providers/authstate_provider.dart +++ b/lib/src/providers/authstate_provider.dart @@ -1,4 +1,5 @@ import 'package:blt/src/providers/providers_imports.dart'; +import 'package:http/http.dart' as http; /// The provider which exposes the state management for user authentication. final authStateNotifier = @@ -16,6 +17,8 @@ class AuthNotifier extends StateNotifier> { authstate ?? const AsyncValue.data(AuthState.loggedOut), ); + final client = http.Client(); + /// Do a guest type authentication. Future guestLogin() async { await storage.write( @@ -75,7 +78,7 @@ class AuthNotifier extends StateNotifier> { username: username, token: accessToken, ); - UserApiClient.getUserInfo(currentUser!); + UserApiClient.getUserInfo(client, currentUser!); state = AsyncValue.data(AuthState.loggedIn); read(loginProvider.notifier).setUserLogin(); @@ -124,7 +127,7 @@ class AuthNotifier extends StateNotifier> { if (rememberMe) { rememberUser(currentUser!.username!, currentUser!.token!); } - await UserApiClient.getUserInfo(currentUser!); + await UserApiClient.getUserInfo(client, currentUser!); state = AsyncValue.data(AuthState.loggedIn); read(loginProvider.notifier).setUserLogin(); diff --git a/lib/src/providers/companies/company_list_provider.dart b/lib/src/providers/companies/company_list_provider.dart index d341999888..a3a55ad46f 100644 --- a/lib/src/providers/companies/company_list_provider.dart +++ b/lib/src/providers/companies/company_list_provider.dart @@ -1,6 +1,7 @@ import 'package:blt/src/components/components_import.dart'; import 'package:blt/src/models/company_model.dart'; import 'package:blt/src/util/api/company_api.dart'; +import 'package:http/http.dart' as http; final companiesListProvider = StateNotifierProvider?>?>( @@ -19,9 +20,10 @@ class CompanyListNotifier extends StateNotifier?>?> { } Future _retrieveCompaniesList() async { + final client = http.Client(); try { final List? companyData = - await CompanyApiClient.getListOfCompanies("/company/"); + await CompanyApiClient.getListOfCompanies(client, "/company/"); state = AsyncValue.data(companyData); } catch (e) { AsyncValue.error(e); diff --git a/lib/src/providers/issuelist_provider.dart b/lib/src/providers/issuelist_provider.dart index 009b8b642e..edb50da74e 100644 --- a/lib/src/providers/issuelist_provider.dart +++ b/lib/src/providers/issuelist_provider.dart @@ -1,4 +1,5 @@ import 'package:blt/src/providers/providers_imports.dart'; +import 'package:http/http.dart' as http; /// The provider which exposes the state management /// for issues in the issue list. @@ -16,12 +17,14 @@ class IssueListProvider extends StateNotifier?>?> { : super(issueList ?? const AsyncValue.loading()) { _retrieveIssueList(); } + final client = http.Client(); /// Default call for getting first page of issues /// when the provider is initialized. Future _retrieveIssueList() async { try { final IssueData? issueData = await IssueApiClient.getAllIssues( + client, IssueEndPoints.issues, ); nxtUrl = issueData!.nextQuery; @@ -36,6 +39,7 @@ class IssueListProvider extends StateNotifier?>?> { _cacheState(); try { final IssueData? issueData = await IssueApiClient.getAllIssues( + client, nextUrl, ); diff --git a/lib/src/providers/leaderboards/companyscoreboard_provider.dart b/lib/src/providers/leaderboards/companyscoreboard_provider.dart index 7c616b1dc6..b471ea69c8 100644 --- a/lib/src/providers/leaderboards/companyscoreboard_provider.dart +++ b/lib/src/providers/leaderboards/companyscoreboard_provider.dart @@ -1,4 +1,5 @@ import 'package:blt/src/providers/providers_imports.dart'; +import 'package:http/http.dart' as http; /// The provider which exposes the state management /// for companies in the company scoreboard list. @@ -24,6 +25,7 @@ class CompanyScoreboardNotifier try { final List? companyData = await LeaderboardApiClient.getScoreBoardData( + http.Client(), LeaderboardEndpoints.companyScoreboard, ); diff --git a/lib/src/providers/leaderboards/globalleaderboard_povider.dart b/lib/src/providers/leaderboards/globalleaderboard_povider.dart index e012f7d29e..1ae0b95a97 100644 --- a/lib/src/providers/leaderboards/globalleaderboard_povider.dart +++ b/lib/src/providers/leaderboards/globalleaderboard_povider.dart @@ -1,4 +1,5 @@ import 'package:blt/src/providers/providers_imports.dart'; +import 'package:http/http.dart' as http; /// The provider which exposes the state management /// for users in the global leaderboard list. @@ -23,6 +24,7 @@ class GlobalLeaderBoardNotifier try { final List? leaderData = await LeaderboardApiClient.getLeaderData( + http.Client(), LeaderboardEndpoints.globalLeaderboard, ); diff --git a/lib/src/providers/leaderboards/monthlyleaderboard_provider.dart b/lib/src/providers/leaderboards/monthlyleaderboard_provider.dart index 5dcac3ff41..ea5f2ae86f 100644 --- a/lib/src/providers/leaderboards/monthlyleaderboard_provider.dart +++ b/lib/src/providers/leaderboards/monthlyleaderboard_provider.dart @@ -1,5 +1,6 @@ import 'package:blt/src/models/leaderdata_model.dart'; import 'package:blt/src/providers/providers_imports.dart'; +import 'package:http/http.dart' as http; final monthlyLeaderBoardProvider = StateNotifierProvider< MonthlyLeaderBoardNotifier, AsyncValue?>?>((ref) { @@ -21,6 +22,7 @@ class MonthlyLeaderBoardNotifier try { final LeaderData? monthlyLeaderData = await LeaderboardApiClient.getMonthlyLeaderData( + http.Client(), LeaderboardEndpoints.monthly_leaderboard, year, month, diff --git a/lib/src/util/api/company_api.dart b/lib/src/util/api/company_api.dart index 05459cfa9b..4c3a76a620 100644 --- a/lib/src/util/api/company_api.dart +++ b/lib/src/util/api/company_api.dart @@ -6,11 +6,12 @@ import 'package:http/http.dart' as http; class CompanyApiClient { CompanyApiClient._(); - static Future> getListOfCompanies(String endpoint) async { + static Future> getListOfCompanies( + http.Client client, String endpoint) async { String searchUrl = GeneralEndPoints.apiBaseUrl + endpoint; List companiesList = []; try { - var response = await http.get(Uri.parse(searchUrl)); + var response = await client.get(Uri.parse(searchUrl)); var decodedResponse = jsonDecode(utf8.decode(response.bodyBytes)); companiesList = Company.fromSnapshot(decodedResponse["results"]); } catch (e) { @@ -21,24 +22,18 @@ class CompanyApiClient { /// Search a company by keyword, /// returns the first matching result. - static Future getCompanyByKeyWord( - Company company, - String keyword, - ) async { - http.Response? response; - String searchUrl = CompanyEndpoints.domain + "?search=$keyword"; + static Future getCompanyByKeyWord( + http.Client client, String paginated_url, String keyword) async { + String searchUrl = paginated_url + "?search=$keyword"; + // print(searchUrl); try { - response = await http.get(Uri.parse(searchUrl)); + var response = await client.get(Uri.parse(searchUrl)); var decodedResponse = jsonDecode(utf8.decode(response.bodyBytes)); - var companyJson = decodedResponse["results"][0]; - company.setMoreInfo( - companyJson["id"], - companyJson["email"], - companyJson["url"], - companyJson["color"], - ); + var companyJson = Company.fromJson(decodedResponse["results"][0]); + return companyJson; } catch (e) { print(e); } + return null; } } diff --git a/lib/src/util/api/issues_api.dart b/lib/src/util/api/issues_api.dart index d17a63594e..40599ffbc5 100644 --- a/lib/src/util/api/issues_api.dart +++ b/lib/src/util/api/issues_api.dart @@ -8,7 +8,8 @@ class IssueApiClient { IssueApiClient._(); /// Get all the issues relating to the [paginatedUrl]. - static Future getAllIssues(String paginatedUrl) async { + static Future getAllIssues( + http.Client client, String paginatedUrl) async { http.Response? response; IssueData? issueData; List? issueList; @@ -18,7 +19,7 @@ class IssueApiClient { } : null; try { - response = await http.get( + response = await client.get( Uri.parse(paginatedUrl), headers: headers, ); diff --git a/lib/src/util/api/leaderboard_api.dart b/lib/src/util/api/leaderboard_api.dart index 009ec988b5..d6eccef52c 100644 --- a/lib/src/util/api/leaderboard_api.dart +++ b/lib/src/util/api/leaderboard_api.dart @@ -5,12 +5,13 @@ import 'package:blt/src/util/util_import.dart'; class LeaderboardApiClient { LeaderboardApiClient._(); - static Future> getLeaderData(String paginatedUrl) async { - return http + static Future> getLeaderData( + http.Client client, String paginatedUrl) async { + return client .get( Uri.parse(paginatedUrl), ) - .then((http.Response response) { + .then((var response) { List leaders = (json.decode(utf8.decode(response.bodyBytes)) as List) .map((data) => Leaders.fromJson(data)) @@ -20,18 +21,18 @@ class LeaderboardApiClient { } static Future getMonthlyLeaderData( - String paginatedUrl, int? year, int? month) async { + http.Client client, String paginatedUrl, int? year, int? month) async { final queryParams = { "filter": '1', "year": year.toString(), "month": month.toString(), }; - print(Uri.parse(paginatedUrl).replace(queryParameters: queryParams)); - return http + // print(Uri.parse(paginatedUrl).replace(queryParameters: queryParams)); + return client .get( Uri.parse(paginatedUrl).replace(queryParameters: queryParams), ) - .then((http.Response response) { + .then((var response) { List leaderList = []; var decodedResponse = jsonDecode(utf8.decode(response.bodyBytes)); decodedResponse["results"].forEach((element) { @@ -52,7 +53,7 @@ class LeaderboardApiClient { .get( Uri.parse(nextUrl!), ) - .then((http.Response response) { + .then((var response) { List leaderList = []; var decodedResponse = jsonDecode(utf8.decode(response.bodyBytes)); decodedResponse["results"].forEach((element) { @@ -68,8 +69,9 @@ class LeaderboardApiClient { }); } - static Future> getScoreBoardData(String? paginatedUrl) async { - var req = await http.get( + static Future> getScoreBoardData( + http.Client client, String? paginatedUrl) async { + var req = await client.get( Uri.parse(paginatedUrl!), ); var response = jsonDecode(req.body); diff --git a/lib/src/util/api/user_api.dart b/lib/src/util/api/user_api.dart index 06760456ee..c09e4e283b 100644 --- a/lib/src/util/api/user_api.dart +++ b/lib/src/util/api/user_api.dart @@ -7,7 +7,7 @@ class UserApiClient { /// Get a user's details from username and token, /// used for currentUser. - static Future getUserDetails(User user) async { + static Future getUserDetails(http.Client client, User user) async { http.Response? response; try { response = await http.get( @@ -23,11 +23,10 @@ class UserApiClient { /// Get a user's details, queried /// against a [user]'s username. - static Future getUserInfo(User user) async { - http.Response? response; + static Future getUserInfo(http.Client client, User user) async { try { String searchUrl = UserEndPoints.userInfo + "?search=${user.username}"; - response = await http.get( + var response = await client.get( Uri.parse(searchUrl), headers: { "Authorization": "Token ${user.token}", @@ -35,18 +34,21 @@ class UserApiClient { ); var decodedResponse = jsonDecode(utf8.decode(response.bodyBytes))["results"][0]; - user.id = decodedResponse["user"]["id"]; + // user.id = decodedResponse["user"]["id"]; user.pfpLink = decodedResponse["user_avatar"]; user.title = decodedResponse["title"]; + user.email = decodedResponse["email"]; user.winning = decodedResponse["winnings"]; user.description = decodedResponse["description"]; - user.following = decodedResponse["follows"].cast(); - user.likedIssueId = decodedResponse["issue_upvoted"].cast(); - user.savedIssueId = decodedResponse["issue_saved"].cast(); + user.following = decodedResponse["follows"] as List? ?? []; + user.likedIssueId = decodedResponse["issue_upvoted"] as List? ?? []; + user.savedIssueId = decodedResponse["issue_saved"] as List? ?? []; user.totalScore = decodedResponse["total_score"]; + return user; } catch (e) { print(e); } + return null; } static Future updatePfp(XFile image, User user) async { diff --git a/pubspec.yaml b/pubspec.yaml index 64abc9e4e3..e10f9fada6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,6 +33,7 @@ dependencies: flutter_localizations: sdk: flutter primer_progress_bar: ^0.4.2 + testing: ^0.0.11 dev_dependencies: flutter_launcher_icons: ">=0.9.0 <0.13.0" diff --git a/test/company_test.dart b/test/company_test.dart new file mode 100644 index 0000000000..f0c7a323d6 --- /dev/null +++ b/test/company_test.dart @@ -0,0 +1,90 @@ +import 'test_imports.dart'; +import 'package:http/http.dart' as http; + +void main() { + setUp(() { + currentUser = guestUser; + }); + + group("Companie Api's Test", () { + test("Get All Companies", () async { + final paginatedUrl = 'https://www.bugheist.com/company/'; + final dynamic mockResponse = { + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "id": 1, + "name": "BLT Test", + "description": + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop p", + "logo": + "http://192.168.56.1:8000/media/company_logos/Screenshot_2023-11-17_184658_6qvsATu.png", + "url": "http://www.bltTest.com", + "email": "bltTest@gmail.com", + "twitter": null, + "facebook": null, + "created": "2024-05-31T10:32:30.585653Z", + "modified": "2024-06-11T14:33:37.271785Z", + "is_active": false, + "admin": 1, + "subscription": null, + "managers": [1] + }, + ] + }; + final client = MockClient((request) async { + final response = mockResponse; + return http.Response(jsonEncode(response), 200); + }); + final result = + await CompanyApiClient.getListOfCompanies(client, paginatedUrl); + + expect(result.length, 1); + expect(result[0].id, 1); + expect(result[0].companyName, "BLT Test"); + expect(result[0].email, "bltTest@gmail.com"); + expect(result[0].url, "http://www.bltTest.com"); + }); + + test("Get Company by keyword", () async { + final paginatedUrl = 'https://www.bugheist.com/company/'; + final dynamic mockResponse = { + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "id": 1, + "name": "BLT Test", + "description": + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop p", + "logo": + "http://192.168.56.1:8000/media/company_logos/Screenshot_2023-11-17_184658_6qvsATu.png", + "url": "http://www.bltTest.com", + "email": "bltTest@gmail.com", + "twitter": null, + "facebook": null, + "created": "2024-05-31T10:32:30.585653Z", + "modified": "2024-06-11T14:33:37.271785Z", + "is_active": false, + "admin": 1, + "subscription": null, + "managers": [1] + }, + ] + }; + final client = MockClient((request) async { + final response = mockResponse; + return http.Response(jsonEncode(response), 200); + }); + final result = await CompanyApiClient.getCompanyByKeyWord( + client, paginatedUrl, "BLT Test"); + + expect(result?.companyName, "BLT Test"); + expect(result?.email, "bltTest@gmail.com"); + expect(result?.url, "http://www.bltTest.com"); + }); + }); +} diff --git a/test/issue_test.dart b/test/issue_test.dart new file mode 100644 index 0000000000..8e712048df --- /dev/null +++ b/test/issue_test.dart @@ -0,0 +1,80 @@ +import 'test_imports.dart'; +import 'package:http/http.dart' as http; + +void main() { + setUp(() { + currentUser = guestUser; + }); + group("Issue Api's Test", () { + test('getAllIssues returns correct data', () async { + final paginatedUrl = 'https://www.bugheist.com/api/v1/issues/'; + final dynamic mockResponse = { + "count": 244, + "next": "https://www.bugheist.com/api/v1/issues/?page=2&search=bug", + "previous": null, + "results": [ + { + "id": 1, + "user": null, + "url": "http://bugheist.com", + "description": "Issue 1", + "markdown_description": "", + "label": 0, + "views": 64, + "verified": false, + "score": null, + "status": "open", + "user_agent": "Mozilla/5.0 (X11; Linux x86_64", + "screenshot": null, + "closed_date": null, + "github_url": "", + "created": "2024-03-23T15:45:31.895903Z", + "modified": "2024-03-29T03:42:55.120275Z", + "is_hidden": false, + "rewarded": 0, + "reporter_ip_address": "24.90.6.174", + "cve_id": null, + "cve_score": null, + "hunt": null, + "domain": 3, + "closed_by": null, + "team_members": [], + "upvotes": 0, + "flags": 0, + "upvotted": false, + "flagged": false, + "screenshots": [ + "https://storage.googleapis.com/bhfiles/screenshots/pasted-ima0265cdff-894d-48ff-ab07-4ad962.png" + ] + } + ] + }; + final client = MockClient((request) async { + // Create sample response of the HTTP call // + final response = mockResponse; + return http.Response(jsonEncode(response), 200); + }); + + final result = await IssueApiClient.getAllIssues(client, paginatedUrl); + + expect(result?.issueList?.length, 1); + expect(result?.issueList?[0].id, 1); + expect(result?.issueList?[0].title, 'Issue 1'); + expect(result?.issueList?[0].domain, 3); + expect(result?.issueList?[0].screenshotsLink?.length, 1); + }); + + test('getAllIssues handles errors gracefully', () async { + final paginatedUrl = 'https://www.bugheist.com/issues'; + final client = MockClient((request) async { + // Create sample response of the HTTP call // + final response = null; + return http.Response(jsonEncode(response), 500); + }); + + final result = await IssueApiClient.getAllIssues(client, paginatedUrl); + + expect(result, isNull); + }); + }); +} diff --git a/test/leaderboard_test.dart b/test/leaderboard_test.dart new file mode 100644 index 0000000000..88da37349b --- /dev/null +++ b/test/leaderboard_test.dart @@ -0,0 +1,135 @@ +import 'test_imports.dart'; +import 'package:http/http.dart' as http; + +void main() { + setUp(() { + currentUser = guestUser; + }); + group("LeaderBoard Api's Test", () { + test("Get Leaders Api Test", () async { + final paginatedUrl = LeaderboardEndpoints.globalLeaderboard; + final mockResponse = [ + { + "rank": 1, + "id": 1, + "User": "test1", + "score": {"total_score": 612}, + "image": {"user_avatar": "avatarstest1"}, + "title_type": {"title": 3}, + "follows": {"follows": null}, + "savedissue": {"issue_saved": null} + }, + { + "rank": 2, + "id": 919, + "User": "test2", + "score": {"total_score": 442}, + "image": {"user_avatar": "avatarstest2"}, + "title_type": {"title": 3}, + "follows": {"follows": null}, + "savedissue": {"issue_saved": null} + }, + ]; + final client = MockClient((request) async { + return http.Response(jsonEncode(mockResponse), 200); + }); + final responseLeaders = + await LeaderboardApiClient.getLeaderData(client, paginatedUrl); + expect(responseLeaders.length, 2); + expect(responseLeaders[0].user, "test1"); + expect(responseLeaders[0].rank, 1); + expect(responseLeaders[1].user, "test2"); + expect(responseLeaders[1].rank, 2); + }); + + test("Get Monthly Leaders Api Test", () async { + final paginatedUrl = LeaderboardEndpoints.globalLeaderboard; + final mockResponse = { + "count": 2, + "results": [ + { + "rank": 1, + "id": 1, + "User": "test1", + "score": {"total_score": 612}, + "image": {"user_avatar": "avatar/test1"}, + "title_type": {"title": 3}, + "follows": {"follows": null}, + "savedissue": {"issue_saved": null} + }, + { + "rank": 2, + "id": 919, + "User": "test2", + "score": {"total_score": 442}, + "image": {"user_avatar": "avatar/test2"}, + "title_type": {"title": 3}, + "follows": {"follows": null}, + "savedissue": {"issue_saved": null} + } + ] + }; + final client = MockClient((request) async { + return http.Response(jsonEncode(mockResponse), 200); + }); + final responseLeader = await LeaderboardApiClient.getMonthlyLeaderData( + client, paginatedUrl, 2023, 12); + expect(responseLeader.leaderList?.length, 2); + expect(responseLeader.leaderList?[0].user, "test1"); + expect(responseLeader.leaderList?[0].rank, 1); + expect(responseLeader.leaderList?[1].user, "test2"); + expect(responseLeader.leaderList?[1].rank, 2); + }); + + test("Get Scoreboard Api Test", () async { + final paginatedUrl = LeaderboardEndpoints.companyScoreboard; + final mockResponse = { + "count": 2, + "next": null, + "previous": null, + "results": [ + { + "id": 1, + "admin_id": 1198, + "name": "test.com", + "logo": "test-logo.jpg", + "url": "www.test.com", + "email": "", + "twitter": "", + "facebook": "", + "created": "2023-11-24T13:10:02.149368Z", + "modified": "2023-11-27T13:20:52.155917Z", + "subscription_id": null, + "is_active": true, + "issue_count": 10 + }, + { + "id": 2, + "admin_id": 1198, + "name": "test2.com", + "logo": "test2-logo.jpg", + "url": "www.test2.com", + "email": "", + "twitter": "", + "facebook": "", + "created": "2023-11-24T13:30:02.149448Z", + "modified": "2023-11-25T13:30:02.154517Z", + "subscription_id": null, + "is_active": true, + "issue_count": 5 + } + ] + }; + final client = MockClient((request) async { + return http.Response(jsonEncode(mockResponse), 200); + }); + final response = + await LeaderboardApiClient.getScoreBoardData(client, paginatedUrl); + expect(response.length, 2); + expect(response[0].companyName, "test.com"); + expect(response[0].issueCount, 10); + expect(response[1].companyName, "test2.com"); + expect(response[1].issueCount, 5); + }); + }); +} diff --git a/test/test_imports.dart b/test/test_imports.dart new file mode 100644 index 0000000000..3cfc910396 --- /dev/null +++ b/test/test_imports.dart @@ -0,0 +1,7 @@ +export 'dart:convert'; +export 'package:blt/src/components/components_import.dart'; +export 'package:blt/src/models/user_model.dart'; +export 'package:flutter_test/flutter_test.dart'; +export 'package:http/testing.dart'; +export 'package:blt/src/pages/leaderboards/leaderboards_imports.dart'; +export 'package:blt/src/util/api/user_api.dart'; diff --git a/test/user_test.dart b/test/user_test.dart new file mode 100644 index 0000000000..c366c31f28 --- /dev/null +++ b/test/user_test.dart @@ -0,0 +1,44 @@ +import 'test_imports.dart'; +import 'package:http/http.dart' as http; + +void main() { + setUp(() { + currentUser = guestUser; + }); + group("User Api's Test", () { + test('Get User Info', () async { + // Mock response data + final dynamic mockResponse = { + 'count': 1, + "results": [ + { + 'username': 'test_user', + 'token': 'test_token', + 'other_data': 'test_data', + 'description': 'description', + 'email': 'test@gmail.com', + } + ] + }; + + final user = User(); + user.id = 1; + user.username = 'test_user'; + user.token = 'test_token'; + + final client = MockClient((request) async { + if (request.headers['Authorization'] == 'Token test_token') { + return http.Response(jsonEncode(mockResponse), 200); + } else { + return http.Response('Unauthorized', 401); + } + }); + + final responseUser = await UserApiClient.getUserInfo(client, user); + expect(responseUser?.username, 'test_user'); + expect(responseUser?.description, 'description'); + expect(responseUser?.email, 'test@gmail.com'); + expect(responseUser?.token, 'test_token'); + }); + }); +}