33namespace DirectoryTree \OpenSearchAdapter \Testing \Fakes ;
44
55use DirectoryTree \OpenSearchAdapter \Indices \Alias ;
6+ use DirectoryTree \OpenSearchAdapter \Indices \AliasActions ;
67use DirectoryTree \OpenSearchAdapter \Indices \IndexBlueprint ;
78use DirectoryTree \OpenSearchAdapter \Indices \IndexManagerInterface ;
89use DirectoryTree \OpenSearchAdapter \Indices \Mapping ;
@@ -70,6 +71,13 @@ class FakeIndexManager implements IndexManagerInterface
7071 */
7172 protected array $ aliases = [];
7273
74+ /**
75+ * The atomic alias updates.
76+ *
77+ * @var array<int, AliasActions>
78+ */
79+ protected array $ aliasUpdates = [];
80+
7381 /**
7482 * The deleted aliases.
7583 *
@@ -153,7 +161,15 @@ public function putSettings(string $index, Settings $settings): static
153161 public function delete (string $ index ): static
154162 {
155163 $ this ->deleted [] = $ index ;
156- $ this ->existing = array_values (array_diff ($ this ->existing , [$ index ]));
164+
165+ $ this ->existing = array_values (
166+ array_diff ($ this ->existing , [$ index ])
167+ );
168+
169+ $ this ->aliases = array_values (array_filter (
170+ $ this ->aliases ,
171+ fn (array $ operation ) => $ operation ['index ' ] !== $ index ,
172+ ));
157173
158174 return $ this ;
159175 }
@@ -181,6 +197,8 @@ public function getAliases(string $index): array
181197 */
182198 public function putAlias (string $ index , Alias $ alias ): static
183199 {
200+ $ this ->removeAlias ($ index , $ alias ->name ());
201+
184202 $ this ->aliases [] = compact ('index ' , 'alias ' );
185203
186204 return $ this ;
@@ -196,6 +214,49 @@ public function deleteAlias(string $index, string $aliasName): static
196214 'alias ' => $ aliasName ,
197215 ];
198216
217+ $ this ->removeAlias ($ index , $ aliasName );
218+
219+ return $ this ;
220+ }
221+
222+ /**
223+ * Atomically apply multiple alias actions.
224+ */
225+ public function updateAliases (AliasActions $ actions ): static
226+ {
227+ $ this ->aliasUpdates [] = $ actions ;
228+
229+ foreach ($ actions ->actions () as $ action ) {
230+ if ($ parameters = $ action ['add ' ] ?? null ) {
231+ $ alias = new Alias (
232+ $ parameters ['alias ' ],
233+ $ parameters ['filter ' ] ?? null ,
234+ $ parameters ['routing ' ] ?? null ,
235+ $ parameters ['is_write_index ' ] ?? null ,
236+ );
237+
238+ $ this ->removeAlias ($ parameters ['index ' ], $ parameters ['alias ' ]);
239+
240+ $ this ->aliases [] = [
241+ 'index ' => $ parameters ['index ' ],
242+ 'alias ' => $ alias ,
243+ ];
244+ }
245+
246+ if ($ parameters = $ action ['remove ' ] ?? null ) {
247+ $ this ->deletedAliases [] = [
248+ 'index ' => $ parameters ['index ' ],
249+ 'alias ' => $ parameters ['alias ' ],
250+ ];
251+
252+ $ this ->removeAlias ($ parameters ['index ' ], $ parameters ['alias ' ]);
253+ }
254+
255+ if ($ parameters = $ action ['remove_index ' ] ?? null ) {
256+ $ this ->delete ($ parameters ['index ' ]);
257+ }
258+ }
259+
199260 return $ this ;
200261 }
201262
@@ -300,4 +361,26 @@ public function assertAliasDeleted(string $index, string $alias): static
300361
301362 return $ this ;
302363 }
364+
365+ /**
366+ * Assert that the given atomic alias update was performed.
367+ */
368+ public function assertAliasesUpdated (AliasActions $ actions ): static
369+ {
370+ PHPUnit::assertContainsEquals ($ actions , $ this ->aliasUpdates );
371+
372+ return $ this ;
373+ }
374+
375+ /**
376+ * Remove an alias from the fake's current state.
377+ */
378+ protected function removeAlias (string $ index , string $ alias ): void
379+ {
380+ $ this ->aliases = array_values (
381+ array_filter ($ this ->aliases , fn (array $ operation ) => (
382+ $ operation ['index ' ] !== $ index || $ operation ['alias ' ]->name () !== $ alias
383+ ))
384+ );
385+ }
303386}
0 commit comments