mobile bluesky app made with flutter
lazurite.stormlightlabs.org/
mobile
bluesky
flutter
1import 'package:flutter_test/flutter_test.dart';
2import 'package:lazurite/features/auth/data/models/auth_models.dart';
3
4void main() {
5 group('AuthTokens', () {
6 test('should create AuthTokens with all fields', () {
7 const tokens = AuthTokens(
8 accessToken: 'access_token',
9 refreshToken: 'refresh_token',
10 did: 'did:plc:abc123',
11 handle: 'user.bsky.social',
12 displayName: 'User Name',
13 service: 'bsky.social',
14 oauthService: 'bsky.social',
15 oauthClientId: 'https://lazurite.stormlightlabs.org/client-metadata.json',
16 );
17
18 expect(tokens.accessToken, equals('access_token'));
19 expect(tokens.refreshToken, equals('refresh_token'));
20 expect(tokens.did, equals('did:plc:abc123'));
21 expect(tokens.handle, equals('user.bsky.social'));
22 expect(tokens.displayName, equals('User Name'));
23 expect(tokens.service, equals('bsky.social'));
24 expect(tokens.oauthService, equals('bsky.social'));
25 expect(tokens.oauthClientId, equals('https://lazurite.stormlightlabs.org/client-metadata.json'));
26 });
27
28 test('should create AuthTokens without optional fields', () {
29 const tokens = AuthTokens(accessToken: 'access_token', did: 'did:plc:abc123', handle: 'user.bsky.social');
30
31 expect(tokens.accessToken, equals('access_token'));
32 expect(tokens.refreshToken, isNull);
33 expect(tokens.did, equals('did:plc:abc123'));
34 expect(tokens.handle, equals('user.bsky.social'));
35 expect(tokens.displayName, isNull);
36 });
37
38 test('should copy with new values', () {
39 const tokens = AuthTokens(accessToken: 'old_token', did: 'did:plc:abc123', handle: 'user.bsky.social');
40
41 final newTokens = tokens.copyWith(
42 accessToken: 'new_token',
43 displayName: 'New Name',
44 oauthService: 'bsky.social',
45 oauthClientId: 'client-id',
46 );
47
48 expect(newTokens.accessToken, equals('new_token'));
49 expect(newTokens.did, equals('did:plc:abc123'));
50 expect(newTokens.displayName, equals('New Name'));
51 expect(newTokens.oauthService, equals('bsky.social'));
52 expect(newTokens.oauthClientId, equals('client-id'));
53 });
54
55 test('should identify oauth-backed sessions', () {
56 const tokens = AuthTokens(
57 accessToken: 'access_token',
58 refreshToken: 'refresh_token',
59 did: 'did:plc:abc123',
60 handle: 'user.bsky.social',
61 dpopPublicKey: 'public',
62 dpopPrivateKey: 'private',
63 authMethod: AuthMethod.oauth,
64 );
65
66 expect(tokens.usesOAuth, isTrue);
67 });
68
69 test('should check if tokens are expired', () {
70 final expiredDate = DateTime.now().subtract(const Duration(hours: 1));
71 final tokens = AuthTokens(
72 accessToken: 'token',
73 did: 'did:plc:abc123',
74 handle: 'user.bsky.social',
75 expiresAt: expiredDate,
76 );
77
78 expect(tokens.isExpired, isTrue);
79 });
80
81 test('should check if tokens are not expired', () {
82 final futureDate = DateTime.now().add(const Duration(hours: 1));
83 final tokens = AuthTokens(
84 accessToken: 'token',
85 did: 'did:plc:abc123',
86 handle: 'user.bsky.social',
87 expiresAt: futureDate,
88 );
89
90 expect(tokens.isExpired, isFalse);
91 });
92
93 test('should check if tokens without expiry are not expired', () {
94 const tokens = AuthTokens(accessToken: 'token', did: 'did:plc:abc123', handle: 'user.bsky.social');
95
96 expect(tokens.isExpired, isFalse);
97 });
98
99 test('should support value equality', () {
100 const tokens1 = AuthTokens(accessToken: 'token', did: 'did:plc:abc123', handle: 'user.bsky.social');
101 const tokens2 = AuthTokens(accessToken: 'token', did: 'did:plc:abc123', handle: 'user.bsky.social');
102
103 expect(tokens1, equals(tokens2));
104 });
105 });
106
107 group('User', () {
108 test('should create User with all fields', () {
109 const user = User(
110 did: 'did:plc:abc123',
111 handle: 'user.bsky.social',
112 displayName: 'User Name',
113 avatar: 'https://example.com/avatar.jpg',
114 description: 'User description',
115 );
116
117 expect(user.did, equals('did:plc:abc123'));
118 expect(user.handle, equals('user.bsky.social'));
119 expect(user.displayName, equals('User Name'));
120 expect(user.avatar, equals('https://example.com/avatar.jpg'));
121 expect(user.description, equals('User description'));
122 });
123
124 test('should create User without optional fields', () {
125 const user = User(did: 'did:plc:abc123', handle: 'user.bsky.social');
126
127 expect(user.did, equals('did:plc:abc123'));
128 expect(user.handle, equals('user.bsky.social'));
129 expect(user.displayName, isNull);
130 expect(user.avatar, isNull);
131 expect(user.description, isNull);
132 });
133
134 test('should copy with new values', () {
135 const user = User(did: 'did:plc:abc123', handle: 'user.bsky.social');
136
137 final newUser = user.copyWith(displayName: 'New Name', avatar: 'https://example.com/new-avatar.jpg');
138
139 expect(newUser.did, equals('did:plc:abc123'));
140 expect(newUser.displayName, equals('New Name'));
141 expect(newUser.avatar, equals('https://example.com/new-avatar.jpg'));
142 });
143
144 test('should support value equality', () {
145 const user1 = User(did: 'did:plc:abc123', handle: 'user.bsky.social');
146 const user2 = User(did: 'did:plc:abc123', handle: 'user.bsky.social');
147
148 expect(user1, equals(user2));
149 });
150 });
151}