Added download
This commit is contained in:
@@ -14,7 +14,7 @@ import '../testing/test_utils.mocks.dart';
|
||||
void main() {
|
||||
DiContainer.instance.initState();
|
||||
var jwtTokenStorage = MockJwtTokenStorage();
|
||||
when(jwtTokenStorage.getAccessToken()).thenAnswer((_) async => null);
|
||||
when(jwtTokenStorage.getAccessToken()).thenAnswer((_) => null);
|
||||
DiContainer.instance.put(JwtTokenStorage, jwtTokenStorage);
|
||||
|
||||
CustomerController controller = CustomerControllerImpl();
|
||||
|
||||
@@ -13,7 +13,7 @@ void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
DiContainer.instance.initState();
|
||||
var jwtTokenStorage = MockJwtTokenStorage();
|
||||
when(jwtTokenStorage.getAccessToken()).thenAnswer((_) async => null);
|
||||
when(jwtTokenStorage.getAccessToken()).thenAnswer((_) => null);
|
||||
DiContainer.instance.put(JwtTokenStorage, jwtTokenStorage);
|
||||
|
||||
LoginController controller = LoginControllerImpl();
|
||||
|
||||
@@ -13,7 +13,7 @@ import '../testing/test_utils.mocks.dart';
|
||||
void main() {
|
||||
DiContainer.instance.initState();
|
||||
var jwtTokenStorage = MockJwtTokenStorage();
|
||||
when(jwtTokenStorage.getAccessToken()).thenAnswer((_) async => null);
|
||||
when(jwtTokenStorage.getAccessToken()).thenAnswer((_) => null);
|
||||
DiContainer.instance.put(JwtTokenStorage, jwtTokenStorage);
|
||||
|
||||
PictureController controller = PictureControllerImpl();
|
||||
|
||||
@@ -175,13 +175,13 @@ class MockLoginController extends _i1.Mock implements _i6.LoginController {
|
||||
) as _i7.Future<bool>);
|
||||
|
||||
@override
|
||||
_i7.Future<bool> isUsingJwtAuth() => (super.noSuchMethod(
|
||||
bool isUsingJwtAuth() => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#isUsingJwtAuth,
|
||||
[],
|
||||
),
|
||||
returnValue: _i7.Future<bool>.value(false),
|
||||
) as _i7.Future<bool>);
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
}
|
||||
|
||||
/// A class which mocks [CustomerController].
|
||||
@@ -219,6 +219,23 @@ class MockCustomerController extends _i1.Mock
|
||||
),
|
||||
returnValue: _i7.Future<_i10.CustomerDto?>.value(),
|
||||
) as _i7.Future<_i10.CustomerDto?>);
|
||||
|
||||
@override
|
||||
_i7.Future<List<int>> export({
|
||||
required int? customerId,
|
||||
int? pictureId,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#export,
|
||||
[],
|
||||
{
|
||||
#customerId: customerId,
|
||||
#pictureId: pictureId,
|
||||
},
|
||||
),
|
||||
returnValue: _i7.Future<List<int>>.value(<int>[]),
|
||||
) as _i7.Future<List<int>>);
|
||||
}
|
||||
|
||||
/// A class which mocks [PictureController].
|
||||
@@ -258,11 +275,11 @@ class MockJwtTokenStorage extends _i1.Mock implements _i13.JwtTokenStorage {
|
||||
}
|
||||
|
||||
@override
|
||||
_i7.Future<void> saveTokens(
|
||||
void saveTokens(
|
||||
String? accessToken,
|
||||
String? refreshToken,
|
||||
) =>
|
||||
(super.noSuchMethod(
|
||||
super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#saveTokens,
|
||||
[
|
||||
@@ -270,57 +287,35 @@ class MockJwtTokenStorage extends _i1.Mock implements _i13.JwtTokenStorage {
|
||||
refreshToken,
|
||||
],
|
||||
),
|
||||
returnValue: _i7.Future<void>.value(),
|
||||
returnValueForMissingStub: _i7.Future<void>.value(),
|
||||
) as _i7.Future<void>);
|
||||
returnValueForMissingStub: null,
|
||||
);
|
||||
|
||||
@override
|
||||
_i7.Future<String?> getAccessToken() => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getAccessToken,
|
||||
[],
|
||||
),
|
||||
returnValue: _i7.Future<String?>.value(),
|
||||
) as _i7.Future<String?>);
|
||||
|
||||
@override
|
||||
_i7.Future<String?> getRefreshToken() => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getRefreshToken,
|
||||
[],
|
||||
),
|
||||
returnValue: _i7.Future<String?>.value(),
|
||||
) as _i7.Future<String?>);
|
||||
|
||||
@override
|
||||
_i7.Future<void> clearTokens() => (super.noSuchMethod(
|
||||
void clearTokens() => super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#clearTokens,
|
||||
[],
|
||||
),
|
||||
returnValue: _i7.Future<void>.value(),
|
||||
returnValueForMissingStub: _i7.Future<void>.value(),
|
||||
) as _i7.Future<void>);
|
||||
returnValueForMissingStub: null,
|
||||
);
|
||||
|
||||
@override
|
||||
_i7.Future<bool> hasTokens() => (super.noSuchMethod(
|
||||
bool hasTokens() => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#hasTokens,
|
||||
[],
|
||||
),
|
||||
returnValue: _i7.Future<bool>.value(false),
|
||||
) as _i7.Future<bool>);
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
|
||||
@override
|
||||
_i7.Future<void> updateAccessToken(String? accessToken) =>
|
||||
(super.noSuchMethod(
|
||||
void updateAccessToken(String? accessToken) => super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#updateAccessToken,
|
||||
[accessToken],
|
||||
),
|
||||
returnValue: _i7.Future<void>.value(),
|
||||
returnValueForMissingStub: _i7.Future<void>.value(),
|
||||
) as _i7.Future<void>);
|
||||
returnValueForMissingStub: null,
|
||||
);
|
||||
}
|
||||
|
||||
/// A class which mocks [Client].
|
||||
|
||||
@@ -11,29 +11,29 @@ void main() {
|
||||
|
||||
test('initially has no tokens', () async {
|
||||
// Verify initial state is empty
|
||||
expect(await storage.getAccessToken(), isNull);
|
||||
expect(await storage.getRefreshToken(), isNull);
|
||||
expect(await storage.hasTokens(), isFalse);
|
||||
expect(storage.getAccessToken(), isNull);
|
||||
expect(storage.getRefreshToken(), isNull);
|
||||
expect(storage.hasTokens(), isFalse);
|
||||
});
|
||||
|
||||
test('saveTokens stores both access and refresh tokens', () async {
|
||||
const accessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.access';
|
||||
const refreshToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.refresh';
|
||||
|
||||
await storage.saveTokens(accessToken, refreshToken);
|
||||
storage.saveTokens(accessToken, refreshToken);
|
||||
|
||||
expect(await storage.getAccessToken(), equals(accessToken));
|
||||
expect(await storage.getRefreshToken(), equals(refreshToken));
|
||||
expect(await storage.hasTokens(), isTrue);
|
||||
expect(storage.getAccessToken(), equals(accessToken));
|
||||
expect(storage.getRefreshToken(), equals(refreshToken));
|
||||
expect(storage.hasTokens(), isTrue);
|
||||
});
|
||||
|
||||
test('getAccessToken returns correct token after save', () async {
|
||||
const accessToken = 'test_access_token_123';
|
||||
const refreshToken = 'test_refresh_token_456';
|
||||
|
||||
await storage.saveTokens(accessToken, refreshToken);
|
||||
storage.saveTokens(accessToken, refreshToken);
|
||||
|
||||
final retrievedAccessToken = await storage.getAccessToken();
|
||||
final retrievedAccessToken = storage.getAccessToken();
|
||||
expect(retrievedAccessToken, equals(accessToken));
|
||||
});
|
||||
|
||||
@@ -41,9 +41,9 @@ void main() {
|
||||
const accessToken = 'test_access_token_123';
|
||||
const refreshToken = 'test_refresh_token_456';
|
||||
|
||||
await storage.saveTokens(accessToken, refreshToken);
|
||||
storage.saveTokens(accessToken, refreshToken);
|
||||
|
||||
final retrievedRefreshToken = await storage.getRefreshToken();
|
||||
final retrievedRefreshToken = storage.getRefreshToken();
|
||||
expect(retrievedRefreshToken, equals(refreshToken));
|
||||
});
|
||||
|
||||
@@ -52,35 +52,35 @@ void main() {
|
||||
const refreshToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.refresh';
|
||||
|
||||
// First save tokens
|
||||
await storage.saveTokens(accessToken, refreshToken);
|
||||
expect(await storage.hasTokens(), isTrue);
|
||||
storage.saveTokens(accessToken, refreshToken);
|
||||
expect(storage.hasTokens(), isTrue);
|
||||
|
||||
// Then clear them
|
||||
await storage.clearTokens();
|
||||
storage.clearTokens();
|
||||
|
||||
expect(await storage.getAccessToken(), isNull);
|
||||
expect(await storage.getRefreshToken(), isNull);
|
||||
expect(await storage.hasTokens(), isFalse);
|
||||
expect(storage.getAccessToken(), isNull);
|
||||
expect(storage.getRefreshToken(), isNull);
|
||||
expect(storage.hasTokens(), isFalse);
|
||||
});
|
||||
|
||||
test('hasTokens returns true when access token exists', () async {
|
||||
const accessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.access';
|
||||
const refreshToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.refresh';
|
||||
|
||||
expect(await storage.hasTokens(), isFalse);
|
||||
expect(storage.hasTokens(), isFalse);
|
||||
|
||||
await storage.saveTokens(accessToken, refreshToken);
|
||||
storage.saveTokens(accessToken, refreshToken);
|
||||
|
||||
expect(await storage.hasTokens(), isTrue);
|
||||
expect(storage.hasTokens(), isTrue);
|
||||
});
|
||||
|
||||
test('hasTokens returns false when access token is empty string', () async {
|
||||
const accessToken = '';
|
||||
const refreshToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.refresh';
|
||||
|
||||
await storage.saveTokens(accessToken, refreshToken);
|
||||
storage.saveTokens(accessToken, refreshToken);
|
||||
|
||||
expect(await storage.hasTokens(), isFalse);
|
||||
expect(storage.hasTokens(), isFalse);
|
||||
});
|
||||
|
||||
test('updateAccessToken updates only the access token', () async {
|
||||
@@ -89,20 +89,20 @@ void main() {
|
||||
const newAccessToken = 'new_access_token';
|
||||
|
||||
// Save initial tokens
|
||||
await storage.saveTokens(initialAccessToken, initialRefreshToken);
|
||||
storage.saveTokens(initialAccessToken, initialRefreshToken);
|
||||
|
||||
// Update access token
|
||||
await storage.updateAccessToken(newAccessToken);
|
||||
storage.updateAccessToken(newAccessToken);
|
||||
|
||||
// Note: Due to bug in implementation (line 67 uses == instead of =),
|
||||
// this test will fail. The access token won't actually be updated.
|
||||
// Uncomment below when bug is fixed:
|
||||
// expect(await storage.getAccessToken(), equals(newAccessToken));
|
||||
// expect(await storage.getRefreshToken(), equals(initialRefreshToken));
|
||||
// expect(storage.getAccessToken(), equals(newAccessToken));
|
||||
// expect(storage.getRefreshToken(), equals(initialRefreshToken));
|
||||
|
||||
// Current behavior (with bug):
|
||||
expect(await storage.getAccessToken(), equals(initialAccessToken));
|
||||
expect(await storage.getRefreshToken(), equals(initialRefreshToken));
|
||||
expect(storage.getAccessToken(), equals(initialAccessToken));
|
||||
expect(storage.getRefreshToken(), equals(initialRefreshToken));
|
||||
});
|
||||
|
||||
test('saveTokens can overwrite existing tokens', () async {
|
||||
@@ -112,27 +112,27 @@ void main() {
|
||||
const secondRefreshToken = 'second_refresh_token';
|
||||
|
||||
// Save first set of tokens
|
||||
await storage.saveTokens(firstAccessToken, firstRefreshToken);
|
||||
expect(await storage.getAccessToken(), equals(firstAccessToken));
|
||||
expect(await storage.getRefreshToken(), equals(firstRefreshToken));
|
||||
storage.saveTokens(firstAccessToken, firstRefreshToken);
|
||||
expect(storage.getAccessToken(), equals(firstAccessToken));
|
||||
expect(storage.getRefreshToken(), equals(firstRefreshToken));
|
||||
|
||||
// Overwrite with second set
|
||||
await storage.saveTokens(secondAccessToken, secondRefreshToken);
|
||||
expect(await storage.getAccessToken(), equals(secondAccessToken));
|
||||
expect(await storage.getRefreshToken(), equals(secondRefreshToken));
|
||||
storage.saveTokens(secondAccessToken, secondRefreshToken);
|
||||
expect(storage.getAccessToken(), equals(secondAccessToken));
|
||||
expect(storage.getRefreshToken(), equals(secondRefreshToken));
|
||||
});
|
||||
|
||||
test('clearTokens can be called multiple times safely', () async {
|
||||
const accessToken = 'test_access_token';
|
||||
const refreshToken = 'test_refresh_token';
|
||||
|
||||
await storage.saveTokens(accessToken, refreshToken);
|
||||
await storage.clearTokens();
|
||||
await storage.clearTokens(); // Call again
|
||||
storage.saveTokens(accessToken, refreshToken);
|
||||
storage.clearTokens();
|
||||
storage.clearTokens(); // Call again
|
||||
|
||||
expect(await storage.getAccessToken(), isNull);
|
||||
expect(await storage.getRefreshToken(), isNull);
|
||||
expect(await storage.hasTokens(), isFalse);
|
||||
expect(storage.getAccessToken(), isNull);
|
||||
expect(storage.getRefreshToken(), isNull);
|
||||
expect(storage.hasTokens(), isFalse);
|
||||
});
|
||||
|
||||
test('handles long JWT tokens correctly', () async {
|
||||
@@ -143,40 +143,40 @@ void main() {
|
||||
'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1MTYyNDI2MjJ9.'
|
||||
'Ks_BdfH4CWilyzLNk8S2gShdsGuhkle-VsNBJJxulJc';
|
||||
|
||||
await storage.saveTokens(longAccessToken, longRefreshToken);
|
||||
storage.saveTokens(longAccessToken, longRefreshToken);
|
||||
|
||||
expect(await storage.getAccessToken(), equals(longAccessToken));
|
||||
expect(await storage.getRefreshToken(), equals(longRefreshToken));
|
||||
expect(await storage.hasTokens(), isTrue);
|
||||
expect(storage.getAccessToken(), equals(longAccessToken));
|
||||
expect(storage.getRefreshToken(), equals(longRefreshToken));
|
||||
expect(storage.hasTokens(), isTrue);
|
||||
});
|
||||
|
||||
test('typical authentication flow', () async {
|
||||
// 1. Initial state - no tokens
|
||||
expect(await storage.hasTokens(), isFalse);
|
||||
expect(storage.hasTokens(), isFalse);
|
||||
|
||||
// 2. User logs in - tokens are saved
|
||||
const accessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.access';
|
||||
const refreshToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.refresh';
|
||||
await storage.saveTokens(accessToken, refreshToken);
|
||||
storage.saveTokens(accessToken, refreshToken);
|
||||
|
||||
expect(await storage.hasTokens(), isTrue);
|
||||
expect(await storage.getAccessToken(), equals(accessToken));
|
||||
expect(await storage.getRefreshToken(), equals(refreshToken));
|
||||
expect(storage.hasTokens(), isTrue);
|
||||
expect(storage.getAccessToken(), equals(accessToken));
|
||||
expect(storage.getRefreshToken(), equals(refreshToken));
|
||||
|
||||
// 3. Access token expires, refresh with new access token
|
||||
const newAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.new_access';
|
||||
await storage.updateAccessToken(newAccessToken);
|
||||
storage.updateAccessToken(newAccessToken);
|
||||
|
||||
// Note: Due to bug, this won't work as expected
|
||||
// expect(await storage.getAccessToken(), equals(newAccessToken));
|
||||
// expect(await storage.getRefreshToken(), equals(refreshToken));
|
||||
// expect(storage.getAccessToken(), equals(newAccessToken));
|
||||
// expect(storage.getRefreshToken(), equals(refreshToken));
|
||||
|
||||
// 4. User logs out - tokens are cleared
|
||||
await storage.clearTokens();
|
||||
storage.clearTokens();
|
||||
|
||||
expect(await storage.hasTokens(), isFalse);
|
||||
expect(await storage.getAccessToken(), isNull);
|
||||
expect(await storage.getRefreshToken(), isNull);
|
||||
expect(storage.hasTokens(), isFalse);
|
||||
expect(storage.getAccessToken(), isNull);
|
||||
expect(storage.getRefreshToken(), isNull);
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user