Skip to content

Commit 8423a23

Browse files
committed
test: add feed rules models tests
- Add PlacementCriteria tests - Add EngagementRule tests - Add SuggestionRule tests
1 parent 348898b commit 8423a23

File tree

1 file changed

+386
-0
lines changed

1 file changed

+386
-0
lines changed
Lines changed: 386 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,386 @@
1+
import 'package:ht_shared/ht_shared.dart';
2+
import 'package:test/test.dart';
3+
4+
void main() {
5+
group('PlacementCriteria', () {
6+
PlacementCriteria createSubject({
7+
int? afterPrimaryItemIndex,
8+
String? relativePosition,
9+
int? minPrimaryItemsRequired,
10+
}) {
11+
return PlacementCriteria(
12+
afterPrimaryItemIndex: afterPrimaryItemIndex,
13+
relativePosition: relativePosition,
14+
minPrimaryItemsRequired: minPrimaryItemsRequired,
15+
);
16+
}
17+
18+
test('can be instantiated', () {
19+
final instance = createSubject();
20+
expect(instance, isNotNull);
21+
expect(instance.afterPrimaryItemIndex, isNull);
22+
expect(instance.relativePosition, isNull);
23+
expect(instance.minPrimaryItemsRequired, isNull);
24+
});
25+
26+
test('supports value equality', () {
27+
final instanceA = createSubject(
28+
afterPrimaryItemIndex: 5,
29+
relativePosition: 'middle',
30+
minPrimaryItemsRequired: 10,
31+
);
32+
final instanceB = createSubject(
33+
afterPrimaryItemIndex: 5,
34+
relativePosition: 'middle',
35+
minPrimaryItemsRequired: 10,
36+
);
37+
final instanceC = createSubject(
38+
afterPrimaryItemIndex: 10,
39+
);
40+
41+
expect(instanceA, equals(instanceB));
42+
expect(instanceA, isNot(equals(instanceC)));
43+
});
44+
45+
test('props are correct', () {
46+
final instance = createSubject(
47+
afterPrimaryItemIndex: 5,
48+
relativePosition: 'middle',
49+
minPrimaryItemsRequired: 10,
50+
);
51+
52+
expect(
53+
instance.props,
54+
[5, 'middle', 10],
55+
);
56+
});
57+
58+
group('fromJson', () {
59+
test('returns correct PlacementCriteria object', () {
60+
final json = <String, dynamic>{
61+
'afterPrimaryItemIndex': 5,
62+
'relativePosition': 'middle',
63+
'minPrimaryItemsRequired': 10,
64+
};
65+
66+
final instance = PlacementCriteria.fromJson(json);
67+
68+
expect(instance.afterPrimaryItemIndex, 5);
69+
expect(instance.relativePosition, 'middle');
70+
expect(instance.minPrimaryItemsRequired, 10);
71+
});
72+
73+
test('handles null optional fields', () {
74+
final json = <String, dynamic>{};
75+
76+
final instance = PlacementCriteria.fromJson(json);
77+
78+
expect(instance.afterPrimaryItemIndex, isNull);
79+
expect(instance.relativePosition, isNull);
80+
expect(instance.minPrimaryItemsRequired, isNull);
81+
});
82+
});
83+
84+
group('toJson', () {
85+
test('returns correct JSON map', () {
86+
final instance = createSubject(
87+
afterPrimaryItemIndex: 5,
88+
relativePosition: 'middle',
89+
minPrimaryItemsRequired: 10,
90+
);
91+
92+
final json = instance.toJson();
93+
94+
expect(json, <String, dynamic>{
95+
'afterPrimaryItemIndex': 5,
96+
'relativePosition': 'middle',
97+
'minPrimaryItemsRequired': 10,
98+
});
99+
});
100+
101+
test('handles null optional fields', () {
102+
final instance = createSubject();
103+
104+
final json = instance.toJson();
105+
106+
expect(json, <String, dynamic>{});
107+
});
108+
});
109+
});
110+
111+
group('EngagementRule', () {
112+
EngagementRule createSubject({
113+
EngagementTemplateType templateType = EngagementTemplateType.rateApp,
114+
List<UserRole> userRoles = const [UserRole.standardUser],
115+
int? minDaysSinceAccountCreation,
116+
int? maxTimesToShow,
117+
int? minDaysSinceLastShown,
118+
PlacementCriteria? placement,
119+
}) {
120+
return EngagementRule(
121+
templateType: templateType,
122+
userRoles: userRoles,
123+
minDaysSinceAccountCreation: minDaysSinceAccountCreation,
124+
maxTimesToShow: maxTimesToShow,
125+
minDaysSinceLastShown: minDaysSinceLastShown,
126+
placement: placement,
127+
);
128+
}
129+
130+
test('can be instantiated', () {
131+
final instance = createSubject();
132+
expect(instance, isNotNull);
133+
expect(instance.templateType, EngagementTemplateType.rateApp);
134+
expect(instance.userRoles, [UserRole.standardUser]);
135+
});
136+
137+
test('supports value equality', () {
138+
final instanceA = createSubject(
139+
userRoles: [UserRole.standardUser],
140+
minDaysSinceAccountCreation: 7,
141+
);
142+
final instanceB = createSubject(
143+
userRoles: [UserRole.standardUser],
144+
minDaysSinceAccountCreation: 7,
145+
);
146+
final instanceC = createSubject(
147+
templateType: EngagementTemplateType.linkAccount,
148+
);
149+
150+
expect(instanceA, equals(instanceB));
151+
expect(instanceA, isNot(equals(instanceC)));
152+
});
153+
154+
test('props are correct', () {
155+
const placement = PlacementCriteria(afterPrimaryItemIndex: 3);
156+
final instance = createSubject(
157+
templateType: EngagementTemplateType.upgradeToPremium,
158+
userRoles: [UserRole.premiumUser, UserRole.admin],
159+
minDaysSinceAccountCreation: 30,
160+
maxTimesToShow: 5,
161+
minDaysSinceLastShown: 1,
162+
placement: placement,
163+
);
164+
165+
expect(
166+
instance.props,
167+
[
168+
EngagementTemplateType.upgradeToPremium,
169+
[UserRole.premiumUser, UserRole.admin],
170+
30,
171+
5,
172+
1,
173+
placement,
174+
],
175+
);
176+
});
177+
178+
group('fromJson', () {
179+
test('returns correct EngagementRule object', () {
180+
final json = <String, dynamic>{
181+
'templateType': 'rate-app',
182+
'userRoles': ['standard_user', 'guest_user'],
183+
'minDaysSinceAccountCreation': 7,
184+
'maxTimesToShow': 3,
185+
'minDaysSinceLastShown': 1,
186+
'placement': {
187+
'afterPrimaryItemIndex': 2,
188+
},
189+
};
190+
191+
final instance = EngagementRule.fromJson(json);
192+
193+
expect(instance.templateType, EngagementTemplateType.rateApp);
194+
expect(
195+
instance.userRoles,
196+
[UserRole.standardUser, UserRole.guestUser],
197+
);
198+
expect(instance.minDaysSinceAccountCreation, 7);
199+
expect(instance.maxTimesToShow, 3);
200+
expect(instance.minDaysSinceLastShown, 1);
201+
expect(instance.placement, isA<PlacementCriteria>());
202+
expect(instance.placement!.afterPrimaryItemIndex, 2);
203+
});
204+
205+
test('handles null optional fields', () {
206+
final json = <String, dynamic>{
207+
'templateType': 'link-account',
208+
'userRoles': ['guest_user'],
209+
};
210+
211+
final instance = EngagementRule.fromJson(json);
212+
213+
expect(instance.templateType, EngagementTemplateType.linkAccount);
214+
expect(instance.userRoles, [UserRole.guestUser]);
215+
expect(instance.minDaysSinceAccountCreation, isNull);
216+
expect(instance.maxTimesToShow, isNull);
217+
expect(instance.minDaysSinceLastShown, isNull);
218+
expect(instance.placement, isNull);
219+
});
220+
});
221+
222+
group('toJson', () {
223+
test('returns correct JSON map', () {
224+
const placement = PlacementCriteria(relativePosition: 'end');
225+
final instance = createSubject(
226+
templateType: EngagementTemplateType.completeProfile,
227+
userRoles: [UserRole.admin],
228+
minDaysSinceAccountCreation: 90,
229+
maxTimesToShow: 1,
230+
minDaysSinceLastShown: 30,
231+
placement: placement,
232+
);
233+
234+
final json = instance.toJson();
235+
236+
expect(json, <String, dynamic>{
237+
'templateType': 'complete-profile',
238+
'userRoles': ['admin'],
239+
'minDaysSinceAccountCreation': 90,
240+
'maxTimesToShow': 1,
241+
'minDaysSinceLastShown': 30,
242+
'placement': {
243+
'relativePosition': 'end',
244+
},
245+
});
246+
});
247+
248+
test('handles null optional fields', () {
249+
final instance = createSubject(
250+
templateType: EngagementTemplateType.exploreNewFeature,
251+
userRoles: [UserRole.standardUser],
252+
);
253+
254+
final json = instance.toJson();
255+
256+
expect(json, <String, dynamic>{
257+
'templateType': 'explore-new-feature',
258+
'userRoles': ['standard_user'],
259+
});
260+
});
261+
});
262+
});
263+
264+
group('SuggestionRule', () {
265+
SuggestionRule createSubject({
266+
SuggestionTemplateType templateType =
267+
SuggestionTemplateType.categoriesToFollow,
268+
List<UserRole> userRoles = const [UserRole.standardUser],
269+
PlacementCriteria? placement,
270+
}) {
271+
return SuggestionRule(
272+
templateType: templateType,
273+
userRoles: userRoles,
274+
placement: placement,
275+
);
276+
}
277+
278+
test('can be instantiated', () {
279+
final instance = createSubject();
280+
expect(instance, isNotNull);
281+
expect(instance.templateType, SuggestionTemplateType.categoriesToFollow);
282+
expect(instance.userRoles, [UserRole.standardUser]);
283+
});
284+
285+
test('supports value equality', () {
286+
final instanceA = createSubject(
287+
userRoles: [UserRole.standardUser],
288+
);
289+
final instanceB = createSubject(
290+
userRoles: [UserRole.standardUser],
291+
);
292+
final instanceC = createSubject(
293+
templateType: SuggestionTemplateType.sourcesToFollow,
294+
);
295+
296+
expect(instanceA, equals(instanceB));
297+
expect(instanceA, isNot(equals(instanceC)));
298+
});
299+
300+
test('props are correct', () {
301+
const placement = PlacementCriteria(minPrimaryItemsRequired: 5);
302+
final instance = createSubject(
303+
templateType: SuggestionTemplateType.countriesToFollow,
304+
userRoles: [UserRole.guestUser, UserRole.premiumUser],
305+
placement: placement,
306+
);
307+
308+
expect(
309+
instance.props,
310+
[
311+
SuggestionTemplateType.countriesToFollow,
312+
[UserRole.guestUser, UserRole.premiumUser],
313+
placement,
314+
],
315+
);
316+
});
317+
318+
group('fromJson', () {
319+
test('returns correct SuggestionRule object', () {
320+
final json = <String, dynamic>{
321+
'templateType': 'sources-to-follow',
322+
'userRoles': ['standard_user'],
323+
'placement': {
324+
'relativePosition': 'start',
325+
},
326+
};
327+
328+
final instance = SuggestionRule.fromJson(json);
329+
330+
expect(instance.templateType, SuggestionTemplateType.sourcesToFollow);
331+
expect(instance.userRoles, [UserRole.standardUser]);
332+
expect(instance.placement, isA<PlacementCriteria>());
333+
expect(instance.placement!.relativePosition, 'start');
334+
});
335+
336+
test('handles null optional fields', () {
337+
final json = <String, dynamic>{
338+
'templateType': 'categories-to-follow',
339+
'userRoles': ['guest_user'],
340+
};
341+
342+
final instance = SuggestionRule.fromJson(json);
343+
344+
expect(
345+
instance.templateType, SuggestionTemplateType.categoriesToFollow);
346+
expect(instance.userRoles, [UserRole.guestUser]);
347+
expect(instance.placement, isNull);
348+
});
349+
});
350+
351+
group('toJson', () {
352+
test('returns correct JSON map', () {
353+
const placement = PlacementCriteria(afterPrimaryItemIndex: 1);
354+
final instance = createSubject(
355+
templateType: SuggestionTemplateType.countriesToFollow,
356+
userRoles: [UserRole.premiumUser],
357+
placement: placement,
358+
);
359+
360+
final json = instance.toJson();
361+
362+
expect(json, <String, dynamic>{
363+
'templateType': 'countries-to-follow',
364+
'userRoles': ['premium_user'],
365+
'placement': {
366+
'afterPrimaryItemIndex': 1,
367+
},
368+
});
369+
});
370+
371+
test('handles null optional fields', () {
372+
final instance = createSubject(
373+
templateType: SuggestionTemplateType.sourcesToFollow,
374+
userRoles: [UserRole.standardUser],
375+
);
376+
377+
final json = instance.toJson();
378+
379+
expect(json, <String, dynamic>{
380+
'templateType': 'sources-to-follow',
381+
'userRoles': ['standard_user'],
382+
});
383+
});
384+
});
385+
});
386+
}

0 commit comments

Comments
 (0)