1+ <?php
2+
3+ namespace Feature ;
4+
5+ use Tests \TestCase ;
6+ use Typesense \Exceptions \RequestMalformed ;
7+ use Exception ;
8+
9+ class AnalyticsRulesV2Test extends TestCase
10+ {
11+ private $ ruleName = 'test_v2_rule ' ;
12+ private $ ruleConfiguration ;
13+
14+ protected function setUp (): void
15+ {
16+ parent ::setUp ();
17+
18+ $ this ->ruleConfiguration = [
19+ "name " => $ this ->ruleName ,
20+ "type " => "counter " ,
21+ "collection " => "test_products " ,
22+ "event_type " => "click " ,
23+ "rule_tag " => "test_tag " ,
24+ "params " => [
25+ "counter_field " => "popularity " ,
26+ "weight " => 1
27+ ]
28+ ];
29+
30+ if (!$ this ->isV30OrAbove ()) {
31+ $ this ->markTestSkipped ('New Analytics API is not supported in Typesense v29.0 and below ' );
32+ }
33+
34+ try {
35+ $ this ->client ()->collections ->create ([
36+ 'name ' => 'test_products ' ,
37+ 'fields ' => [
38+ ['name ' => 'company_name ' , 'type ' => 'string ' ],
39+ ['name ' => 'num_employees ' , 'type ' => 'int32 ' ],
40+ ['name ' => 'country ' , 'type ' => 'string ' , 'facet ' => true ],
41+ ['name ' => 'popularity ' , 'type ' => 'int32 ' , 'optional ' => true ]
42+ ],
43+ 'default_sorting_field ' => 'num_employees '
44+ ]);
45+ } catch (Exception $ e ) {
46+ }
47+
48+ try {
49+ $ this ->client ()->analyticsV2 ->rules ()->create ([$ this ->ruleConfiguration ]);
50+ } catch (Exception $ e ) {
51+ }
52+ }
53+
54+ protected function tearDown (): void
55+ {
56+ if (!$ this ->isV30OrAbove ()) {
57+ try {
58+ $ rules = $ this ->client ()->analyticsV2 ->rules ()->retrieve ();
59+ if (is_array ($ rules )) {
60+ foreach ($ rules as $ rule ) {
61+ if (strpos ($ rule ['name ' ], 'test_v2_ ' ) === 0 ) {
62+ try {
63+ $ this ->client ()->analyticsV2 ->rules ()[$ rule ['name ' ]]->delete ();
64+ } catch (Exception $ e ) {
65+ }
66+ }
67+ }
68+ }
69+ } catch (Exception $ e ) {
70+ }
71+
72+ try {
73+ $ this ->client ()->collections ['test_products ' ]->delete ();
74+ } catch (Exception $ e ) {
75+ }
76+ }
77+ }
78+
79+ public function testCanCreateRulesWithV2API (): void
80+ {
81+ $ rules = [
82+ [
83+ "name " => "test_rule_1 " ,
84+ "type " => "counter " ,
85+ "collection " => "test_products " ,
86+ "event_type " => "click " ,
87+ "rule_tag " => "test_tag " ,
88+ "params " => [
89+ "counter_field " => "popularity " ,
90+ "weight " => 1
91+ ]
92+ ],
93+ [
94+ "name " => "test_rule_2 " ,
95+ "type " => "counter " ,
96+ "collection " => "test_products " ,
97+ "event_type " => "conversion " ,
98+ "rule_tag " => "test_tag " ,
99+ "params " => [
100+ "counter_field " => "popularity " ,
101+ "weight " => 2
102+ ]
103+ ]
104+ ];
105+
106+ $ response = $ this ->client ()->analyticsV2 ->rules ()->create ($ rules );
107+ $ this ->assertIsArray ($ response );
108+
109+ $ allRules = $ this ->client ()->analyticsV2 ->rules ()->retrieve ();
110+ $ this ->assertIsArray ($ allRules );
111+
112+ $ ruleNames = array_column ($ allRules , 'name ' );
113+ $ this ->assertContains ('test_rule_1 ' , $ ruleNames );
114+ $ this ->assertContains ('test_rule_2 ' , $ ruleNames );
115+ }
116+
117+ public function testCanRetrieveARuleWithV2API (): void
118+ {
119+ $ returnData = $ this ->client ()->analyticsV2 ->rules ()[$ this ->ruleName ]->retrieve ();
120+ $ this ->assertEquals ($ this ->ruleName , $ returnData ['name ' ]);
121+ $ this ->assertEquals ('counter ' , $ returnData ['type ' ]);
122+ $ this ->assertEquals ('test_products ' , $ returnData ['collection ' ]);
123+ }
124+
125+ public function testCanUpdateARuleWithV2API (): void
126+ {
127+ $ updateParams = [
128+ "type " => "counter " ,
129+ "collection " => "test_products " ,
130+ "event_type " => "click " ,
131+ "rule_tag " => "updated_tag " ,
132+ "params " => [
133+ "counter_field " => "popularity " ,
134+ "weight " => 5
135+ ]
136+ ];
137+
138+ $ response = $ this ->client ()->analyticsV2 ->rules ()[$ this ->ruleName ]->update ($ updateParams );
139+ $ this ->assertEquals ($ this ->ruleName , $ response ['name ' ]);
140+ $ this ->assertEquals ('updated_tag ' , $ response ['rule_tag ' ]);
141+ $ this ->assertEquals (5 , $ response ['params ' ]['weight ' ]);
142+ }
143+
144+ public function testCanDeleteARuleWithV2API (): void
145+ {
146+ $ returnData = $ this ->client ()->analyticsV2 ->rules ()[$ this ->ruleName ]->delete ();
147+ $ this ->assertEquals ($ this ->ruleName , $ returnData ['name ' ]);
148+
149+ $ this ->expectException (RequestMalformed::class);
150+ $ this ->client ()->analyticsV2 ->rules ()[$ this ->ruleName ]->retrieve ();
151+ }
152+
153+ public function testCanRetrieveAllRulesWithV2API (): void
154+ {
155+ $ returnData = $ this ->client ()->analyticsV2 ->rules ()->retrieve ();
156+ $ this ->assertIsArray ($ returnData );
157+ $ this ->assertGreaterThanOrEqual (1 , count ($ returnData ));
158+
159+ $ ruleNames = array_column ($ returnData , 'name ' );
160+ $ this ->assertContains ('test_v2_rule ' , $ ruleNames );
161+ $ this ->assertContains ('test_rule_1 ' , $ ruleNames );
162+ $ this ->assertContains ('test_rule_2 ' , $ ruleNames );
163+ }
164+
165+ public function testArrayAccessCompatibility (): void
166+ {
167+ $ rule = $ this ->client ()->analyticsV2 ->rules ()[$ this ->ruleName ];
168+ $ this ->assertInstanceOf ('Typesense\AnalyticsRuleV2 ' , $ rule );
169+
170+ $ this ->assertTrue (isset ($ this ->client ()->analyticsV2 ->rules ()[$ this ->ruleName ]));
171+
172+ $ rule = $ this ->client ()->analyticsV2 ->rules ()[$ this ->ruleName ];
173+ $ this ->assertInstanceOf ('Typesense\AnalyticsRuleV2 ' , $ rule );
174+ }
175+ }
0 commit comments