Nikolas Rimikis
1 year ago
1 changed files with 130 additions and 0 deletions
@ -0,0 +1,130 @@
|
||||
// ignore_for_file: avoid_implementing_value_types |
||||
|
||||
import 'dart:convert'; |
||||
import 'dart:typed_data'; |
||||
|
||||
import 'package:mocktail/mocktail.dart'; |
||||
import 'package:neon/blocs.dart'; |
||||
import 'package:neon/src/models/account.dart'; |
||||
import 'package:neon/src/models/app_implementation.dart'; |
||||
import 'package:neon/src/settings/models/exportable.dart'; |
||||
import 'package:neon/src/settings/models/options_collection.dart'; |
||||
import 'package:neon/src/settings/utils/settings_export_helper.dart'; |
||||
import 'package:neon/src/utils/account_options.dart'; |
||||
import 'package:rxdart/rxdart.dart'; |
||||
import 'package:test/test.dart'; |
||||
|
||||
// ignore: missing_override_of_must_be_overridden |
||||
class FakeAppImplementation extends Mock implements AppImplementation {} |
||||
|
||||
class NextcloudAppOptionsMock extends Mock implements NextcloudAppOptions {} |
||||
|
||||
class AccountsBlocMock extends Mock implements AccountsBloc {} |
||||
|
||||
class FakeAccount extends Mock implements Account {} |
||||
|
||||
class AccountSpecificOptionsMock extends Mock implements AccountSpecificOptions {} |
||||
|
||||
class ExporterMock extends Mock implements Exportable {} |
||||
|
||||
void main() { |
||||
group('Exporter', () { |
||||
test('AccountsBlocExporter', () { |
||||
var exporter = const AppImplementationsExporter([]); |
||||
|
||||
var export = exporter.export(); |
||||
expect(Map.fromEntries([export]), {'app': {}}); |
||||
|
||||
final fakeApp = FakeAppImplementation(); |
||||
final fakeOptions = NextcloudAppOptionsMock(); |
||||
exporter = AppImplementationsExporter([fakeApp]); |
||||
|
||||
const appValue = MapEntry('appID', 'value'); |
||||
const appExport = { |
||||
'app': {'appID': 'value'}, |
||||
}; |
||||
|
||||
when(() => fakeApp.options).thenReturn(fakeOptions); |
||||
when(fakeOptions.export).thenReturn(appValue); |
||||
when(() => fakeApp.id).thenReturn('appID'); |
||||
|
||||
export = exporter.export(); |
||||
expect(Map.fromEntries([export]), appExport); |
||||
|
||||
exporter.import(Map.fromEntries([export])); |
||||
verify(() => fakeOptions.import(Map.fromEntries([appValue]))).called(1); |
||||
}); |
||||
|
||||
test('AccountsBlocExporter', () { |
||||
final bloc = AccountsBlocMock(); |
||||
final exporter = AccountsBlocExporter(bloc); |
||||
|
||||
const accountValue = MapEntry('accountID', 'value'); |
||||
const accountExport = { |
||||
'accounts': {'accountID': 'value'}, |
||||
}; |
||||
|
||||
when(() => bloc.accounts).thenAnswer((final _) => BehaviorSubject.seeded([])); |
||||
var export = exporter.export(); |
||||
expect(Map.fromEntries([export]), {'accounts': {}}); |
||||
|
||||
final fakeAccount = FakeAccount(); |
||||
final fakeOptions = AccountSpecificOptionsMock(); |
||||
when(() => bloc.accounts).thenAnswer((final _) => BehaviorSubject.seeded([fakeAccount])); |
||||
when(() => bloc.getOptionsFor(fakeAccount)).thenReturn(fakeOptions); |
||||
when(fakeOptions.export).thenReturn(accountValue); |
||||
when(() => fakeAccount.id).thenReturn('accountID'); |
||||
|
||||
export = exporter.export(); |
||||
expect(Map.fromEntries([export]), accountExport); |
||||
|
||||
exporter.import(Map.fromEntries([export])); |
||||
verify(() => fakeOptions.import(Map.fromEntries([accountValue]))).called(1); |
||||
}); |
||||
}); |
||||
|
||||
group('SettingsExportHelper', () { |
||||
test('SettingsExportHelper.json', () async { |
||||
final exportable = ExporterMock(); |
||||
final settingsExporter = SettingsExportHelper( |
||||
exportables: { |
||||
exportable, |
||||
}, |
||||
); |
||||
|
||||
const value = MapEntry('sxportableKey', 'value'); |
||||
const export = {'sxportableKey': 'value'}; |
||||
|
||||
when(exportable.export).thenAnswer((final _) => value); |
||||
|
||||
expect(settingsExporter.exportToJson(), equals(export)); |
||||
|
||||
await settingsExporter.applyFromJson(export); |
||||
verify(() => exportable.import(Map.fromEntries([value]))).called(1); |
||||
}); |
||||
|
||||
test('SettingsExportHelper.file', () async { |
||||
final exportable = ExporterMock(); |
||||
final settingsExporter = SettingsExportHelper( |
||||
exportables: { |
||||
exportable, |
||||
}, |
||||
); |
||||
|
||||
const value = MapEntry('sxportableKey', 'value'); |
||||
const jsonExport = {'sxportableKey': 'value'}; |
||||
final export = JsonUtf8Encoder().convert(jsonExport) as Uint8List; |
||||
|
||||
when(exportable.export).thenAnswer((final _) => value); |
||||
|
||||
expect(settingsExporter.exportToFile(), equals(export)); |
||||
|
||||
await settingsExporter.applyFromFile(_streamValue(export)); |
||||
verify(() => exportable.import(Map.fromEntries([value]))).called(1); |
||||
}); |
||||
}); |
||||
} |
||||
|
||||
Stream<T> _streamValue<T>(final T value) async* { |
||||
yield value; |
||||
} |
Loading…
Reference in new issue