-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
11 changed files
with
630 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
111 changes: 111 additions & 0 deletions
111
test/repositories/project/project_local_source_test.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
import 'dart:math'; | ||
|
||
import 'package:collection/collection.dart'; | ||
import 'package:flutter_template/core/model/db/repository_db_entity.dart'; | ||
import 'package:flutter_template/core/source/common/app_database.dart'; | ||
import 'package:flutter_template/core/source/project_local_source.dart'; | ||
import 'package:flutter_test/flutter_test.dart'; | ||
|
||
void main() { | ||
late AppDatabase database; | ||
late ProjectLocalSource projectDao; | ||
|
||
setUp(() async { | ||
database = await $FloorAppDatabase.inMemoryDatabaseBuilder().build(); | ||
projectDao = database.projectLocalSource; | ||
}); | ||
|
||
tearDown(() async { | ||
await database.close(); | ||
}); | ||
|
||
group('Test projects db', () { | ||
test('Get projects from empty db, should return an empty list', () async { | ||
final projects = await projectDao.getProjects().first; | ||
expect(projects, []); | ||
}); | ||
test('Insert one project to empty db, should return 1 project', () async { | ||
final project = ProjectDbEntity( | ||
id: 1, | ||
name: 'Test projects', | ||
description: 'Test project description', | ||
url: 'test.com', | ||
imageUrl: '', | ||
language: 'ES', | ||
); | ||
await projectDao.insertProjects([project]); | ||
final projects = await projectDao.getProjects().first; | ||
expect(projects.length, 1); | ||
}); | ||
test('get all projects from db, should return 10', () async { | ||
final projects = Iterable.generate( | ||
10, | ||
(index) => ProjectDbEntity( | ||
id: index, | ||
name: 'Test $index project', | ||
description: 'Test $index project description', | ||
url: 'test$index.com', | ||
imageUrl: '', | ||
language: 'ES', | ||
), | ||
).toList(); | ||
await projectDao.insertProjects(projects); | ||
expect((await projectDao.getProjects().first).length, projects.length); | ||
}); | ||
test('Delete all projects from db, should return empty list', () async { | ||
final projects = Iterable.generate( | ||
10, | ||
(index) => ProjectDbEntity( | ||
id: index, | ||
name: 'Test $index project', | ||
description: 'Test $index project description', | ||
url: 'test$index.com', | ||
imageUrl: '', | ||
language: 'ES', | ||
), | ||
).toList(); | ||
await projectDao.insertProjects(projects); | ||
await projectDao.deleteAllProjects(); | ||
expect(await projectDao.getProjects().first, []); | ||
}); | ||
test('Replace 2 projects from db, should return two new projects', | ||
() async { | ||
final projects = Iterable.generate( | ||
2, | ||
(index) => ProjectDbEntity( | ||
id: index, | ||
name: 'Test $index project', | ||
description: 'Test $index project description', | ||
url: 'test$index.com', | ||
imageUrl: '', | ||
language: 'ES', | ||
), | ||
).toList(); | ||
await projectDao.insertProjects(projects); | ||
final replacement = projects | ||
.map( | ||
(e) => ProjectDbEntity( | ||
id: Random().nextInt(100), | ||
name: 'Test replace project', | ||
description: 'Test project description', | ||
url: 'tes.com', | ||
imageUrl: '', | ||
language: 'ES', | ||
), | ||
) | ||
.toList(); | ||
await projectDao.replaceProjects( | ||
replacement, | ||
); | ||
final list = await projectDao.getProjects().first; | ||
bool result = true; | ||
for (final element in list) { | ||
if (replacement.firstWhereOrNull((e) => e.id == element.id) == null) { | ||
result = false; | ||
break; | ||
} | ||
} | ||
expect(result, true); | ||
}); | ||
}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
import 'package:dio/dio.dart'; | ||
import 'package:flutter_template/core/source/common/http_service.dart'; | ||
import 'package:flutter_template/core/source/project_remote_source.dart'; | ||
import 'package:flutter_test/flutter_test.dart'; | ||
import 'package:mocktail/mocktail.dart'; | ||
|
||
class HttpServiceMock extends Mock implements HttpService {} | ||
|
||
void main() { | ||
late HttpService httpService; | ||
late ProjectRemoteSource projectRemoteSource; | ||
|
||
setUp(() { | ||
httpService = HttpServiceMock(); | ||
projectRemoteSource = ProjectRemoteSource(httpService); | ||
}); | ||
|
||
test('Get projects from API should return one project', () async { | ||
const urlGetProjects = 'rest/v1/projects?select=*'; | ||
final requestOptions = RequestOptions(path: urlGetProjects); | ||
|
||
when(() => httpService.get(urlGetProjects)).thenAnswer( | ||
(_) async => Response( | ||
data: [ | ||
{ | ||
'id': 1, | ||
'name': 'Test projects', | ||
'description': 'Test project description', | ||
'url': 'test.com', | ||
'image_url': '', | ||
'language': 'ES', | ||
} | ||
], | ||
statusCode: 200, | ||
requestOptions: requestOptions, | ||
), | ||
); | ||
|
||
final result = await projectRemoteSource.getProjects(); | ||
expect(result.length, 1); | ||
}); | ||
test('Get projects from empty API should return empty', () async { | ||
const urlGetProjects = 'rest/v1/projects?select=*'; | ||
final requestOptions = RequestOptions(path: urlGetProjects); | ||
|
||
when(() => httpService.get(urlGetProjects)).thenAnswer( | ||
(_) async => Response( | ||
data: [], | ||
statusCode: 200, | ||
requestOptions: requestOptions, | ||
), | ||
); | ||
|
||
final result = await projectRemoteSource.getProjects(); | ||
expect(result.isEmpty, true); | ||
}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
import 'package:flutter_template/core/model/db/repository_db_entity.dart'; | ||
import 'package:flutter_template/core/model/project.dart'; | ||
import 'package:flutter_template/core/repository/project_repository.dart'; | ||
import 'package:flutter_template/core/source/project_local_source.dart'; | ||
import 'package:flutter_template/core/source/project_remote_source.dart'; | ||
import 'package:flutter_test/flutter_test.dart'; | ||
import 'package:mocktail/mocktail.dart'; | ||
|
||
class ProjectLocalSourceMock extends Mock implements ProjectLocalSource {} | ||
|
||
class ProjectRemoteSourceMock extends Mock implements ProjectRemoteSource {} | ||
|
||
void main() { | ||
late ProjectLocalSource projectLocalSource; | ||
late ProjectRemoteSource projectRemoteSource; | ||
late ProjectRepository projectRepository; | ||
|
||
setUp(() async { | ||
projectRepository = ProjectRepository( | ||
projectLocalSource = ProjectLocalSourceMock(), | ||
projectRemoteSource = ProjectRemoteSourceMock(), | ||
); | ||
}); | ||
|
||
test('get projects from empty state', () async { | ||
when(() => projectLocalSource.getProjects()).thenAnswer( | ||
(_) => Stream.value([]), | ||
); | ||
when(() => projectRemoteSource.getProjects()).thenAnswer( | ||
(_) async => [], | ||
); | ||
//Default case for creating the repository | ||
when(() => projectLocalSource.replaceProjects(any())) | ||
.thenAnswer((_) async {}); | ||
|
||
final projects = await projectRepository.getProjects().first; | ||
|
||
verify(() => projectLocalSource.getProjects()).called(1); | ||
verify(() => projectRemoteSource.getProjects()).called(1); | ||
verify(() => projectLocalSource.replaceProjects(any())).called(1); | ||
|
||
expect(projects, []); | ||
}); | ||
|
||
test( | ||
'get projects stream from a loaded state, should return a stream that gives 2 values', | ||
() async { | ||
when(() => projectLocalSource.getProjects()).thenAnswer( | ||
(_) => Stream.value( | ||
[ | ||
ProjectDbEntity( | ||
id: 1, | ||
name: 'Test projects', | ||
description: 'Test project description', | ||
url: 'test.com', | ||
imageUrl: '', | ||
language: 'ES', | ||
), | ||
ProjectDbEntity( | ||
id: 2, | ||
name: 'Test projects', | ||
description: 'Test project description', | ||
url: 'test.com', | ||
imageUrl: '', | ||
language: 'ES', | ||
), | ||
], | ||
), | ||
); | ||
when(() => projectLocalSource.replaceProjects(any())) | ||
.thenAnswer((_) async {}); | ||
when(() => projectRemoteSource.getProjects()).thenAnswer( | ||
(_) async => [ | ||
Project( | ||
id: 1, | ||
name: 'Test projects', | ||
description: 'Test project description', | ||
url: 'test.com', | ||
imageUrl: '', | ||
language: 'ES', | ||
), | ||
Project( | ||
id: 2, | ||
name: 'Test projects', | ||
description: 'Test project description', | ||
url: 'test.com', | ||
imageUrl: '', | ||
language: 'ES', | ||
), | ||
], | ||
); | ||
|
||
final list = await projectRepository.getProjects().first; | ||
verify(() => projectLocalSource.getProjects()).called(1); | ||
verify(() => projectRemoteSource.getProjects()).called(1); | ||
verify(() => projectLocalSource.replaceProjects(any())).called(1); | ||
expect(list?.length, 2); | ||
}, | ||
); | ||
} |
Oops, something went wrong.