Skip to content

Commit ca9d5a7

Browse files
committed
refactor: reorganize test harness
1 parent a7dbb6b commit ca9d5a7

14 files changed

+1218
-637
lines changed

lib/src/transactions/domain/models/list_remove_element_tx_operation.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class ListRemoveElementTxOperation<Element, TResult>
1919
}) : super(touchedKeys: const <String>{});
2020

2121
@override
22-
Set<String> get touchedKeys => {removeElement.toString()};
22+
Set<String> get touchedKeys => {element.toString()};
2323

2424
/// The element to be removed.
2525
final Element element;
Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1 @@
1-
import 'package:grumpy/grumpy.dart';
2-
3-
class TestKey<T> implements CacheKey<T> {
4-
const TestKey(this.namespace, this.primaryKey);
5-
6-
@override
7-
final String namespace;
8-
9-
@override
10-
final String primaryKey;
11-
12-
@override
13-
String get schemaId => 's1';
14-
15-
@override
16-
int? get compatVersion => null;
17-
18-
@override
19-
String asStorageKey() => '$namespace|$schemaId|$primaryKey';
20-
}
1+
export '../../shared/harness/harness.dart' show TestKey;
Lines changed: 4 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import 'dart:async';
21
import 'package:grumpy/grumpy.dart';
2+
import '../../shared/harness/harness.dart';
33

44
class TestQueryRepo extends Repo<List<TestItem>>
55
with
@@ -72,48 +72,9 @@ class UninitializedQueryRepo extends Repo<List<TestItem>>
7272
String get logTag => 'UninitializedQueryRepo';
7373
}
7474

75-
class TestTelemetryService extends TelemetryService {
76-
TestTelemetryService() : super.internal();
77-
78-
int runSpanCalls = 0;
79-
final List<String> runSpanNames = [];
80-
final Map<String, dynamic> spanAttributes = {};
81-
82-
@override
83-
Future<void> recordEvent(
84-
String name, {
85-
Map<String, dynamic>? attributes,
86-
}) async {}
87-
88-
@override
89-
Future<void> recordException(
90-
Object error, [
91-
StackTrace? stackTrace,
92-
Map<String, dynamic>? attributes,
93-
]) async {}
94-
95-
@override
96-
Future<T> runSpan<T>(
97-
String name,
98-
FutureOr<T> Function() callback, {
99-
Map<String, dynamic>? attributes,
100-
}) async {
101-
runSpanCalls++;
102-
runSpanNames.add(name);
103-
if (attributes != null) {
104-
spanAttributes.addAll(attributes);
105-
}
106-
107-
return await callback();
108-
}
75+
class TestTelemetryService extends RecordingTelemetryService {
76+
Map<String, dynamic> get spanAttributes => spanAttributesMerged;
10977

110-
@override
111-
void addSpanAttribute(String key, String value) {
112-
spanAttributes[key] = value;
113-
}
114-
115-
@override
116-
FutureOr<void> free() {}
11778
@override
11879
String get logTag => 'TestTelemetryService';
11980
}
@@ -143,53 +104,7 @@ final seedItems = <TestItem>[
143104
),
144105
];
145106

146-
class TestAnalyticsService extends AnalyticsService {
147-
TestAnalyticsService() : super.internal();
148-
149-
int trackEventCalls = 0;
150-
final List<String> trackedEventNames = [];
151-
final List<Map<String, dynamic>?> trackedEventProperties = [];
152-
153-
@override
154-
FutureOr<void> free() {}
155-
156-
@override
157-
Future<void> groupUser(String groupId, {Map<String, dynamic>? traits}) {
158-
throw UnimplementedError();
159-
}
160-
161-
@override
162-
Future<void> identifyUser(String userId, {Map<String, dynamic>? traits}) {
163-
throw UnimplementedError();
164-
}
165-
166-
@override
167-
Future<void> recordNavigation(
168-
String from,
169-
String to, {
170-
Map<String, dynamic>? properties,
171-
}) {
172-
throw UnimplementedError();
173-
}
174-
175-
@override
176-
Future<void> recordPageView(
177-
String pageName, {
178-
Map<String, dynamic>? properties,
179-
}) {
180-
throw UnimplementedError();
181-
}
182-
183-
@override
184-
Future<void> trackEvent(
185-
String name, {
186-
Map<String, dynamic>? properties,
187-
}) async {
188-
trackEventCalls++;
189-
trackedEventNames.add(name);
190-
trackedEventProperties.add(properties);
191-
}
192-
107+
class TestAnalyticsService extends RecordingAnalyticsService {
193108
@override
194109
String get logTag => 'TestAnalyticsService';
195110
}
Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1 @@
1-
import 'package:grumpy/grumpy.dart';
2-
3-
class StringCodec implements SerializationCodec<String, String> {
4-
const StringCodec();
5-
6-
@override
7-
String decode(String payload) => payload;
8-
9-
@override
10-
String encode(String value) => value;
11-
}
1+
export '../../shared/harness/harness.dart' show StringCodec;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import 'package:get_it/get_it.dart';
2+
import 'package:grumpy/grumpy.dart';
3+
import 'package:grumpy/src/transactions/infra/services/default_tx_engine_factory_service.dart';
4+
5+
Future<GetIt> resetTestDi({bool dispose = true}) async {
6+
final di = GetIt.instance;
7+
await di.reset(dispose: dispose);
8+
return di;
9+
}
10+
11+
Future<GetIt> configureObservabilityDi({
12+
bool dispose = true,
13+
required TelemetryService telemetry,
14+
required AnalyticsService analytics,
15+
bool includeTxEngineFactory = false,
16+
}) async {
17+
final di = await resetTestDi(dispose: dispose);
18+
di.registerSingleton<TelemetryService>(telemetry);
19+
di.registerSingleton<AnalyticsService>(analytics);
20+
if (includeTxEngineFactory) {
21+
di.registerSingleton<TxEngineFactoryService>(
22+
DefaultTxEngineFactoryService(),
23+
);
24+
}
25+
return di;
26+
}

test/shared/harness/harness.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1+
export 'di_test_harness.dart';
12
export 'lifecycle_test_harness.dart';
3+
export 'observability_test_harness.dart';
4+
export 'primitives_test_harness.dart';
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
import 'dart:async';
2+
3+
import 'package:grumpy/grumpy.dart';
4+
5+
class RecordingTelemetryService extends TelemetryService {
6+
RecordingTelemetryService() : super.internal();
7+
8+
int runSpanCalls = 0;
9+
final List<String> runSpanNames = <String>[];
10+
final Map<String, dynamic> spanAttributesMerged = <String, dynamic>{};
11+
final Map<String, Map<String, dynamic>?> spanAttributesByName =
12+
<String, Map<String, dynamic>?>{};
13+
final List<Object> recordedExceptions = <Object>[];
14+
15+
@override
16+
Future<void> recordEvent(
17+
String name, {
18+
Map<String, dynamic>? attributes,
19+
}) async {}
20+
21+
@override
22+
Future<void> recordException(
23+
Object error, [
24+
StackTrace? stackTrace,
25+
Map<String, dynamic>? attributes,
26+
]) async {
27+
recordedExceptions.add(error);
28+
}
29+
30+
@override
31+
Future<T> runSpan<T>(
32+
String name,
33+
FutureOr<T> Function() callback, {
34+
Map<String, dynamic>? attributes,
35+
}) async {
36+
runSpanCalls++;
37+
runSpanNames.add(name);
38+
if (attributes != null) {
39+
spanAttributesMerged.addAll(attributes);
40+
}
41+
spanAttributesByName[name] = attributes;
42+
return await callback();
43+
}
44+
45+
@override
46+
void addSpanAttribute(String key, String value) {
47+
spanAttributesMerged[key] = value;
48+
}
49+
50+
@override
51+
Future<void> free() async {}
52+
53+
@override
54+
String get logTag => 'RecordingTelemetryService';
55+
}
56+
57+
class RecordingAnalyticsService extends AnalyticsService {
58+
RecordingAnalyticsService() : super.internal();
59+
60+
int trackEventCalls = 0;
61+
final List<String> trackedEventNames = <String>[];
62+
final List<Map<String, dynamic>?> trackedEventProperties =
63+
<Map<String, dynamic>?>[];
64+
final List<String> events = <String>[];
65+
final Map<String, Map<String, dynamic>?> eventProperties =
66+
<String, Map<String, dynamic>?>{};
67+
68+
@override
69+
Future<void> trackEvent(
70+
String name, {
71+
Map<String, dynamic>? properties,
72+
}) async {
73+
trackEventCalls++;
74+
trackedEventNames.add(name);
75+
trackedEventProperties.add(properties);
76+
events.add(name);
77+
eventProperties[name] = properties;
78+
}
79+
80+
@override
81+
Future<void> identifyUser(
82+
String userId, {
83+
Map<String, dynamic>? traits,
84+
}) async {}
85+
86+
@override
87+
Future<void> recordNavigation(
88+
String from,
89+
String to, {
90+
Map<String, dynamic>? properties,
91+
}) async {}
92+
93+
@override
94+
Future<void> recordPageView(
95+
String pageName, {
96+
Map<String, dynamic>? properties,
97+
}) async {}
98+
99+
@override
100+
Future<void> groupUser(
101+
String groupId, {
102+
Map<String, dynamic>? traits,
103+
}) async {}
104+
105+
@override
106+
Future<void> free() async {}
107+
108+
@override
109+
String get logTag => 'RecordingAnalyticsService';
110+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import 'package:grumpy/grumpy.dart';
2+
3+
class StringCodec implements SerializationCodec<String, String> {
4+
const StringCodec();
5+
6+
@override
7+
String decode(String payload) => payload;
8+
9+
@override
10+
String encode(String value) => value;
11+
}
12+
13+
class TestKey<T> implements CacheKey<T> {
14+
const TestKey(
15+
this.namespace,
16+
this.primaryKey, {
17+
this.schemaId = 's1',
18+
this.compatVersion,
19+
});
20+
21+
@override
22+
final String namespace;
23+
24+
@override
25+
final String primaryKey;
26+
27+
@override
28+
final String schemaId;
29+
30+
@override
31+
final int? compatVersion;
32+
33+
@override
34+
String asStorageKey() => '$namespace|$schemaId|$primaryKey';
35+
}

test/specs/harness/multi_layer_cache_pipeline_harness.dart

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:grumpy/grumpy.dart';
2+
import '../../shared/harness/harness.dart' as shared;
23

34
class MemoryLayer extends MemoryCacheLayerService {
45
MemoryLayer() : super.internal();
@@ -100,21 +101,7 @@ class FileLayer extends FileCacheLayerService {
100101
String get logTag => 'FileLayer';
101102
}
102103

103-
class TestKey<T> implements CacheKey<T> {
104-
const TestKey(this.namespace, this.primaryKey);
105-
106-
@override
107-
final String namespace;
108-
109-
@override
110-
final String primaryKey;
111-
112-
@override
113-
String get schemaId => 'cache-schema-v1';
114-
115-
@override
116-
int? get compatVersion => null;
117-
118-
@override
119-
String asStorageKey() => '$namespace|$schemaId|$primaryKey';
104+
class TestKey<T> extends shared.TestKey<T> {
105+
const TestKey(super.namespace, super.primaryKey)
106+
: super(schemaId: 'cache-schema-v1');
120107
}

0 commit comments

Comments
 (0)