Skip to content

Commit bad79b2

Browse files
SERDUNclaude
andcommitted
test(logging): add unit tests for LoggingMapper and FeatureAccessStreamFactory logging fields
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 3e277df commit bad79b2

2 files changed

Lines changed: 230 additions & 0 deletions

File tree

test/data/feature_access_stream_factory_test.dart

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:async';
22

33
import 'package:flutter_test/flutter_test.dart';
4+
import 'package:logging/logging.dart';
45
import 'package:mocktail/mocktail.dart';
56
import 'package:async/async.dart';
67

@@ -230,4 +231,106 @@ void main() {
230231

231232
await queue.cancel();
232233
});
234+
235+
test('create() propagates logLevel from RemoteConfig', () async {
236+
final cachedSystemInfo = createMockSystemInfo();
237+
final newRemoteSnapshot = MockRemoteConfigSnapshot();
238+
239+
when(() => newRemoteSnapshot.getString('feature_log_level')).thenReturn('WARNING');
240+
when(() => newRemoteSnapshot.getBool(any())).thenReturn(null);
241+
242+
when(
243+
() => mockSystemInfoRepository.getSystemInfo(fetchPolicy: FetchPolicy.cacheOnly),
244+
).thenAnswer((_) async => cachedSystemInfo);
245+
246+
final stream = factory.create();
247+
final queue = StreamQueue(stream);
248+
249+
await queue.next;
250+
251+
remoteConfigController.add(newRemoteSnapshot);
252+
253+
final secondEmission = await queue.next;
254+
255+
expect(secondEmission.overrides.logLevel, Level.WARNING);
256+
expect(secondEmission.loggingConfig.logLevel, Level.WARNING);
257+
258+
await queue.cancel();
259+
});
260+
261+
test('create() defaults logLevel to Level.INFO when not set in RemoteConfig', () async {
262+
final cachedSystemInfo = createMockSystemInfo();
263+
final newRemoteSnapshot = MockRemoteConfigSnapshot();
264+
265+
when(() => newRemoteSnapshot.getBool(any())).thenReturn(null);
266+
267+
when(
268+
() => mockSystemInfoRepository.getSystemInfo(fetchPolicy: FetchPolicy.cacheOnly),
269+
).thenAnswer((_) async => cachedSystemInfo);
270+
271+
final stream = factory.create();
272+
final queue = StreamQueue(stream);
273+
274+
await queue.next;
275+
276+
remoteConfigController.add(newRemoteSnapshot);
277+
278+
final secondEmission = await queue.next;
279+
280+
expect(secondEmission.overrides.logLevel, isNull);
281+
expect(secondEmission.loggingConfig.logLevel, Level.INFO);
282+
283+
await queue.cancel();
284+
});
285+
286+
test('create() propagates remoteLoggingEnabled from RemoteConfig', () async {
287+
final cachedSystemInfo = createMockSystemInfo();
288+
final newRemoteSnapshot = MockRemoteConfigSnapshot();
289+
290+
when(() => newRemoteSnapshot.getBool(any())).thenReturn(null);
291+
when(() => newRemoteSnapshot.getBool('firebaseRemoteLogging')).thenReturn(true);
292+
293+
when(
294+
() => mockSystemInfoRepository.getSystemInfo(fetchPolicy: FetchPolicy.cacheOnly),
295+
).thenAnswer((_) async => cachedSystemInfo);
296+
297+
final stream = factory.create();
298+
final queue = StreamQueue(stream);
299+
300+
await queue.next;
301+
302+
remoteConfigController.add(newRemoteSnapshot);
303+
304+
final secondEmission = await queue.next;
305+
306+
expect(secondEmission.overrides.remoteLoggingEnabled, isTrue);
307+
expect(secondEmission.loggingConfig.remoteLoggingEnabled, isTrue);
308+
309+
await queue.cancel();
310+
});
311+
312+
test('create() defaults remoteLoggingEnabled to false when not set in RemoteConfig', () async {
313+
final cachedSystemInfo = createMockSystemInfo();
314+
final newRemoteSnapshot = MockRemoteConfigSnapshot();
315+
316+
when(() => newRemoteSnapshot.getBool(any())).thenReturn(null);
317+
318+
when(
319+
() => mockSystemInfoRepository.getSystemInfo(fetchPolicy: FetchPolicy.cacheOnly),
320+
).thenAnswer((_) async => cachedSystemInfo);
321+
322+
final stream = factory.create();
323+
final queue = StreamQueue(stream);
324+
325+
await queue.next;
326+
327+
remoteConfigController.add(newRemoteSnapshot);
328+
329+
final secondEmission = await queue.next;
330+
331+
expect(secondEmission.overrides.remoteLoggingEnabled, isNull);
332+
expect(secondEmission.loggingConfig.remoteLoggingEnabled, isFalse);
333+
334+
await queue.cancel();
335+
});
233336
}

test/data/logging_mapper_test.dart

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:logging/logging.dart';
3+
import 'package:mocktail/mocktail.dart';
4+
5+
import 'package:webtrit_appearance_theme/models/models.dart';
6+
7+
import 'package:webtrit_phone/data/data.dart';
8+
import 'package:webtrit_phone/models/models.dart';
9+
10+
import '../mocks/mocks.dart';
11+
12+
void main() {
13+
group('LoggingMapper.map', () {
14+
late MockAppConfig mockAppConfig;
15+
16+
setUp(() {
17+
mockAppConfig = MockAppConfig();
18+
});
19+
20+
group('logLevel resolution', () {
21+
test('override takes priority over SupportedLoggingConfig', () {
22+
when(() => mockAppConfig.supported).thenReturn([const SupportedFeature.loggingConfig(logLevel: 'WARNING')]);
23+
final overrides = FeatureOverrides(logLevel: Level.FINE);
24+
25+
final config = LoggingMapper.map(mockAppConfig, overrides);
26+
27+
expect(config.logLevel, Level.FINE);
28+
});
29+
30+
test('SupportedLoggingConfig is used when no override', () {
31+
when(() => mockAppConfig.supported).thenReturn([const SupportedFeature.loggingConfig(logLevel: 'WARNING')]);
32+
const overrides = FeatureOverrides();
33+
34+
final config = LoggingMapper.map(mockAppConfig, overrides);
35+
36+
expect(config.logLevel, Level.WARNING);
37+
});
38+
39+
test('defaults to Level.INFO when no override and no SupportedLoggingConfig', () {
40+
when(() => mockAppConfig.supported).thenReturn([]);
41+
const overrides = FeatureOverrides();
42+
43+
final config = LoggingMapper.map(mockAppConfig, overrides);
44+
45+
expect(config.logLevel, Level.INFO);
46+
});
47+
48+
test('defaults to Level.INFO when SupportedLoggingConfig has unknown logLevel string', () {
49+
when(
50+
() => mockAppConfig.supported,
51+
).thenReturn([const SupportedFeature.loggingConfig(logLevel: 'UNKNOWN_LEVEL')]);
52+
const overrides = FeatureOverrides();
53+
54+
final config = LoggingMapper.map(mockAppConfig, overrides);
55+
56+
expect(config.logLevel, Level.INFO);
57+
});
58+
});
59+
60+
group('remoteLoggingEnabled resolution', () {
61+
test('uses override value when set to true', () {
62+
when(() => mockAppConfig.supported).thenReturn([]);
63+
const overrides = FeatureOverrides(remoteLoggingEnabled: true);
64+
65+
final config = LoggingMapper.map(mockAppConfig, overrides);
66+
67+
expect(config.remoteLoggingEnabled, isTrue);
68+
});
69+
70+
test('uses override value when set to false', () {
71+
when(() => mockAppConfig.supported).thenReturn([]);
72+
const overrides = FeatureOverrides(remoteLoggingEnabled: false);
73+
74+
final config = LoggingMapper.map(mockAppConfig, overrides);
75+
76+
expect(config.remoteLoggingEnabled, isFalse);
77+
});
78+
79+
test('defaults to false when not set in overrides', () {
80+
when(() => mockAppConfig.supported).thenReturn([]);
81+
const overrides = FeatureOverrides();
82+
83+
final config = LoggingMapper.map(mockAppConfig, overrides);
84+
85+
expect(config.remoteLoggingEnabled, isFalse);
86+
});
87+
});
88+
});
89+
90+
group('LoggingMapper.mapFromOverridesOnly', () {
91+
group('logLevel resolution', () {
92+
test('uses override logLevel when set', () {
93+
final overrides = FeatureOverrides(logLevel: Level.FINE);
94+
95+
final config = LoggingMapper.mapFromOverridesOnly(overrides);
96+
97+
expect(config.logLevel, Level.FINE);
98+
});
99+
100+
test('defaults to Level.INFO when logLevel not set', () {
101+
const overrides = FeatureOverrides();
102+
103+
final config = LoggingMapper.mapFromOverridesOnly(overrides);
104+
105+
expect(config.logLevel, Level.INFO);
106+
});
107+
});
108+
109+
group('remoteLoggingEnabled resolution', () {
110+
test('uses override value when set to true', () {
111+
const overrides = FeatureOverrides(remoteLoggingEnabled: true);
112+
113+
final config = LoggingMapper.mapFromOverridesOnly(overrides);
114+
115+
expect(config.remoteLoggingEnabled, isTrue);
116+
});
117+
118+
test('defaults to false when not set', () {
119+
const overrides = FeatureOverrides();
120+
121+
final config = LoggingMapper.mapFromOverridesOnly(overrides);
122+
123+
expect(config.remoteLoggingEnabled, isFalse);
124+
});
125+
});
126+
});
127+
}

0 commit comments

Comments
 (0)