Skip to content

Commit a938ec6

Browse files
christophechevalierjcabannes
authored andcommitted
fix(provider): rename getProviderByName to getProviderByType
1 parent 299c77b commit a938ec6

File tree

6 files changed

+95
-22
lines changed

6 files changed

+95
-22
lines changed

src/main/java/io/github/linagora/linid/im/plugin/entity/DynamicEntityServiceImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,8 @@ public Page<DynamicEntity> handleFindAll(HttpServletRequest request, String enti
299299
* @throws ApiException if the provider plugin is unknown
300300
*/
301301
public ProviderPlugin getProvider(DynamicEntity entity) {
302-
return providerFactory.getProviderByName(entity.getConfiguration().getProvider())
302+
var providerConfiguration = getProviderConfiguration(entity);
303+
return providerFactory.getProviderByType(providerConfiguration.getType())
303304
.orElseThrow(() -> new ApiException(500, I18nMessage.of("error.provider.unknown",
304305
Map.of(
305306
ENTITY_KEYWORD, entity.getConfiguration().getName(),

src/main/java/io/github/linagora/linid/im/plugin/provider/ProviderFactoryImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,14 @@
4545
public class ProviderFactoryImpl implements ProviderFactory {
4646
/**
4747
* Registry containing all available {@link ProviderPlugin} instances. Used to resolve the appropriate plugin by matching its
48-
* supported name.
48+
* supported type.
4949
*/
5050
private final PluginRegistry<ProviderPlugin, String> providerRegistry;
5151

5252
@Override
53-
public Optional<ProviderPlugin> getProviderByName(final String name) {
53+
public Optional<ProviderPlugin> getProviderByType(final String type) {
5454
return providerRegistry.getPlugins().stream()
55-
.filter(provider -> provider.supports(name))
55+
.filter(provider -> provider.supports(type))
5656
.findFirst();
5757
}
5858
}

src/main/java/io/github/linagora/linid/im/plugin/task/TaskEngineImpl.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,10 @@ public class TaskEngineImpl implements TaskEngine {
6767
public void execute(DynamicEntity dynamicEntity, TaskExecutionContext context, String phase) {
6868
dynamicEntity.getConfiguration().getTasks()
6969
.stream()
70-
.filter(configuration -> configuration.getPhases().contains(phase))
70+
.filter(task -> task.getPhases().contains(phase))
7171
.map(this::mergeConfigurationWithGlobal)
72-
.forEach(configuration -> getPlugin(configuration)
73-
.execute(configuration, dynamicEntity, context));
72+
.forEach(task -> getPlugin(task)
73+
.execute(task, dynamicEntity, context));
7474
}
7575

7676
/**
@@ -83,7 +83,7 @@ public void execute(DynamicEntity dynamicEntity, TaskExecutionContext context, S
8383
public TaskPlugin getPlugin(TaskConfiguration configuration) {
8484
return taskRegistry.getPlugins()
8585
.stream()
86-
.filter(validationPlugin -> validationPlugin.supports(configuration.getName()))
86+
.filter(taskPlugin -> taskPlugin.supports(configuration.getType()))
8787
.findFirst()
8888
.orElseThrow(() -> new ApiException(400, I18nMessage.of(
8989
"error.plugin.unknown",

src/test/java/io/github/linagora/linid/im/plugin/entity/DynamicEntityServiceImplTest.java

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ void testHandleCreate() {
7777
var entityConfiguration = new EntityConfiguration();
7878
entityConfiguration.setProvider("test");
7979
var providerConfiguration = new ProviderConfiguration();
80+
providerConfiguration.setType("test-type");
8081
var provider = Mockito.mock(ProviderPlugin.class);
8182
var request = Mockito.mock(HttpServletRequest.class);
8283
var authPlugin = Mockito.mock(AllowAllAuthorizationPlugin.class);
@@ -85,7 +86,7 @@ void testHandleCreate() {
8586
Mockito.when(configurationService.getEntityConfiguration(Mockito.anyString())).thenReturn(Optional.of(entityConfiguration));
8687
Mockito.when(configurationService.getProviderConfiguration(Mockito.any()))
8788
.thenReturn(Optional.of(providerConfiguration));
88-
Mockito.when(providerFactory.getProviderByName(Mockito.anyString())).thenReturn(Optional.of(provider));
89+
Mockito.when(providerFactory.getProviderByType(Mockito.anyString())).thenReturn(Optional.of(provider));
8990
Mockito.doNothing().when(taskEngine).execute(Mockito.any(), Mockito.any(), Mockito.any());
9091
Mockito.doNothing().when(validationEngine).validate(Mockito.any(), Mockito.any());
9192
Mockito.when(provider.create(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(null);
@@ -119,6 +120,7 @@ void testHandleUpdate() {
119120
var entityConfiguration = new EntityConfiguration();
120121
entityConfiguration.setProvider("test");
121122
var providerConfiguration = new ProviderConfiguration();
123+
providerConfiguration.setType("test-type");
122124
var provider = Mockito.mock(ProviderPlugin.class);
123125
var request = Mockito.mock(HttpServletRequest.class);
124126
var authPlugin = Mockito.mock(AllowAllAuthorizationPlugin.class);
@@ -127,7 +129,7 @@ void testHandleUpdate() {
127129
Mockito.when(configurationService.getEntityConfiguration(Mockito.anyString())).thenReturn(Optional.of(entityConfiguration));
128130
Mockito.when(configurationService.getProviderConfiguration(Mockito.any()))
129131
.thenReturn(Optional.of(providerConfiguration));
130-
Mockito.when(providerFactory.getProviderByName(Mockito.anyString())).thenReturn(Optional.of(provider));
132+
Mockito.when(providerFactory.getProviderByType(Mockito.anyString())).thenReturn(Optional.of(provider));
131133
Mockito.doNothing().when(taskEngine).execute(Mockito.any(), Mockito.any(), Mockito.any());
132134
Mockito.doNothing().when(validationEngine).validate(Mockito.any(), Mockito.any());
133135
Mockito.when(provider.update(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(null);
@@ -163,6 +165,7 @@ void testHandlePatch() {
163165
var entityConfiguration = new EntityConfiguration();
164166
entityConfiguration.setProvider("test");
165167
var providerConfiguration = new ProviderConfiguration();
168+
providerConfiguration.setType("test-type");
166169
var provider = Mockito.mock(ProviderPlugin.class);
167170
var request = Mockito.mock(HttpServletRequest.class);
168171
var authPlugin = Mockito.mock(AllowAllAuthorizationPlugin.class);
@@ -171,7 +174,7 @@ void testHandlePatch() {
171174
Mockito.when(configurationService.getEntityConfiguration(Mockito.anyString())).thenReturn(Optional.of(entityConfiguration));
172175
Mockito.when(configurationService.getProviderConfiguration(Mockito.any()))
173176
.thenReturn(Optional.of(providerConfiguration));
174-
Mockito.when(providerFactory.getProviderByName(Mockito.anyString())).thenReturn(Optional.of(provider));
177+
Mockito.when(providerFactory.getProviderByType(Mockito.anyString())).thenReturn(Optional.of(provider));
175178
Mockito.doNothing().when(taskEngine).execute(Mockito.any(), Mockito.any(), Mockito.any());
176179
Mockito.doNothing().when(validationEngine).validate(Mockito.any(), Mockito.any());
177180
Mockito.when(provider.patch(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(null);
@@ -207,6 +210,7 @@ void testHandleDelete() {
207210
var entityConfiguration = new EntityConfiguration();
208211
entityConfiguration.setProvider("test");
209212
var providerConfiguration = new ProviderConfiguration();
213+
providerConfiguration.setType("test-type");
210214
var provider = Mockito.mock(ProviderPlugin.class);
211215
var request = Mockito.mock(HttpServletRequest.class);
212216
var authPlugin = Mockito.mock(AllowAllAuthorizationPlugin.class);
@@ -215,7 +219,7 @@ void testHandleDelete() {
215219
Mockito.when(configurationService.getEntityConfiguration(Mockito.anyString())).thenReturn(Optional.of(entityConfiguration));
216220
Mockito.when(configurationService.getProviderConfiguration(Mockito.any()))
217221
.thenReturn(Optional.of(providerConfiguration));
218-
Mockito.when(providerFactory.getProviderByName(Mockito.anyString())).thenReturn(Optional.of(provider));
222+
Mockito.when(providerFactory.getProviderByType(Mockito.anyString())).thenReturn(Optional.of(provider));
219223
Mockito.doNothing().when(taskEngine).execute(Mockito.any(), Mockito.any(), Mockito.any());
220224
Mockito.doNothing().when(validationEngine).validate(Mockito.any(), Mockito.any());
221225
Mockito.when(provider.delete(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(true);
@@ -251,6 +255,7 @@ void testHandleFindById() {
251255
var entityConfiguration = new EntityConfiguration();
252256
entityConfiguration.setProvider("test");
253257
var providerConfiguration = new ProviderConfiguration();
258+
providerConfiguration.setType("test-type");
254259
var provider = Mockito.mock(ProviderPlugin.class);
255260
var request = Mockito.mock(HttpServletRequest.class);
256261
var authPlugin = Mockito.mock(AllowAllAuthorizationPlugin.class);
@@ -259,7 +264,7 @@ void testHandleFindById() {
259264
Mockito.when(configurationService.getEntityConfiguration(Mockito.anyString())).thenReturn(Optional.of(entityConfiguration));
260265
Mockito.when(configurationService.getProviderConfiguration(Mockito.any()))
261266
.thenReturn(Optional.of(providerConfiguration));
262-
Mockito.when(providerFactory.getProviderByName(Mockito.anyString())).thenReturn(Optional.of(provider));
267+
Mockito.when(providerFactory.getProviderByType(Mockito.anyString())).thenReturn(Optional.of(provider));
263268
Mockito.doNothing().when(taskEngine).execute(Mockito.any(), Mockito.any(), Mockito.any());
264269
Mockito.doNothing().when(validationEngine).validate(Mockito.any(), Mockito.any());
265270
Mockito.when(provider.findById(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(null);
@@ -295,6 +300,7 @@ void testHandleFindAll() {
295300
var entityConfiguration = new EntityConfiguration();
296301
entityConfiguration.setProvider("test");
297302
var providerConfiguration = new ProviderConfiguration();
303+
providerConfiguration.setType("test-type");
298304
var provider = Mockito.mock(ProviderPlugin.class);
299305
var request = Mockito.mock(HttpServletRequest.class);
300306
var authPlugin = Mockito.mock(AllowAllAuthorizationPlugin.class);
@@ -303,7 +309,7 @@ void testHandleFindAll() {
303309
Mockito.when(configurationService.getEntityConfiguration(Mockito.anyString())).thenReturn(Optional.of(entityConfiguration));
304310
Mockito.when(configurationService.getProviderConfiguration(Mockito.any()))
305311
.thenReturn(Optional.of(providerConfiguration));
306-
Mockito.when(providerFactory.getProviderByName(Mockito.anyString())).thenReturn(Optional.of(provider));
312+
Mockito.when(providerFactory.getProviderByType(Mockito.anyString())).thenReturn(Optional.of(provider));
307313
Mockito.doNothing().when(taskEngine).execute(Mockito.any(), Mockito.any(), Mockito.any());
308314
Mockito.doNothing().when(validationEngine).validate(Mockito.any(), Mockito.any());
309315
Mockito.when(provider.findAll(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(null);
@@ -353,20 +359,52 @@ void testUpdateEntityConfiguration() {
353359
@Test
354360
@DisplayName("test getProvider: should throw exception without provider")
355361
void testGetProvider() {
356-
Mockito.when(providerFactory.getProviderByName(Mockito.anyString())).thenReturn(Optional.empty());
362+
var providerConfiguration = new ProviderConfiguration();
363+
providerConfiguration.setType("http");
364+
365+
Mockito.when(configurationService.getProviderConfiguration("my-provider"))
366+
.thenReturn(Optional.of(providerConfiguration));
367+
Mockito.when(providerFactory.getProviderByType("http")).thenReturn(Optional.empty());
357368

358369
var entityConfiguration = new EntityConfiguration();
359-
entityConfiguration.setProvider("provider");
370+
entityConfiguration.setProvider("my-provider");
360371
entityConfiguration.setName("name");
361372
var entity = new DynamicEntity();
362373
entity.setConfiguration(entityConfiguration);
363374

364375
ApiException ex = assertThrows(ApiException.class, () -> service.getProvider(entity));
365376
assertEquals("error.provider.unknown", ex.getError().key());
366-
assertEquals(Map.of("entity", "name", "provider", "provider"), ex.getError().context());
377+
assertEquals(Map.of("entity", "name", "provider", "my-provider"), ex.getError().context());
367378
assertEquals(500, ex.getStatusCode());
368379
}
369380

381+
@Test
382+
@DisplayName("test getProvider: should resolve provider by type not by name")
383+
void testGetProviderShouldResolveByType() {
384+
var providerConfiguration = new ProviderConfiguration();
385+
providerConfiguration.setName("my-http-provider");
386+
providerConfiguration.setType("http");
387+
388+
var provider = Mockito.mock(ProviderPlugin.class);
389+
390+
Mockito.when(configurationService.getProviderConfiguration("my-http-provider"))
391+
.thenReturn(Optional.of(providerConfiguration));
392+
Mockito.when(providerFactory.getProviderByType("http")).thenReturn(Optional.of(provider));
393+
394+
var entityConfiguration = new EntityConfiguration();
395+
entityConfiguration.setProvider("my-http-provider");
396+
entityConfiguration.setName("users");
397+
var entity = new DynamicEntity();
398+
entity.setConfiguration(entityConfiguration);
399+
400+
var result = service.getProvider(entity);
401+
402+
assertEquals(provider, result);
403+
// Verify that getProviderByType was called with the TYPE, not the provider NAME
404+
Mockito.verify(providerFactory).getProviderByType("http");
405+
Mockito.verify(providerFactory, Mockito.never()).getProviderByType("my-http-provider");
406+
}
407+
370408
@Test
371409
@DisplayName("test getProviderConfiguration: should throw exception without configuration")
372410
void testGetProviderConfiguration() {

src/test/java/io/github/linagora/linid/im/plugin/provider/ProviderFactoryImplTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ void testProviderFactoryImpl() {
6565
var provider = new SimpleProviderPlugin();
6666
Mockito.when(providerRegistry.getPlugins()).thenReturn(List.of(provider));
6767

68-
var result = providerFactory.getProviderByName("test");
68+
var result = providerFactory.getProviderByType("test");
6969
assertNotNull(result);
7070
assertFalse(result.isEmpty());
7171
assertEquals(provider, result.get());
@@ -77,7 +77,7 @@ void testProviderFactoryImplEmpty() {
7777
var provider = new SimpleProviderPlugin();
7878
Mockito.when(providerRegistry.getPlugins()).thenReturn(List.of(provider));
7979

80-
var result = providerFactory.getProviderByName("bas");
80+
var result = providerFactory.getProviderByType("bas");
8181
assertNotNull(result);
8282
assertTrue(result.isEmpty());
8383
}

src/test/java/io/github/linagora/linid/im/plugin/task/TaskEngineImplTest.java

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,11 @@ void testGetPluginWithInvalidPlugin() {
140140
}
141141

142142
@Test
143-
@DisplayName("test getPlugin: should return plugin with valid plugin")
143+
@DisplayName("test getPlugin: should return plugin matching by type")
144144
void testGetPluginWithValidPlugin() {
145145
TaskConfiguration config = new TaskConfiguration();
146146
config.setName("mytask");
147+
config.setType("dummy-type");
147148

148149
var plugin = new DummyPlugin();
149150
Mockito.when(taskRegistry.getPlugins()).thenReturn(List.of(plugin));
@@ -153,13 +154,29 @@ void testGetPluginWithValidPlugin() {
153154
assertEquals(plugin, result);
154155
}
155156

157+
@Test
158+
@DisplayName("test getPlugin: should not match plugin by name when type differs")
159+
void testGetPluginShouldMatchByTypeNotName() {
160+
TaskConfiguration config = new TaskConfiguration();
161+
config.setName("dummy-type"); // Name matches plugin type
162+
config.setType("different-type"); // But type does not
163+
164+
var plugin = new DummyPlugin();
165+
Mockito.when(taskRegistry.getPlugins()).thenReturn(List.of(plugin));
166+
167+
ApiException ex = assertThrows(ApiException.class, () -> taskEngine.getPlugin(config));
168+
assertEquals("error.plugin.unknown", ex.getError().key());
169+
assertEquals(Map.of("type", "different-type"), ex.getError().context());
170+
}
171+
156172
@Test
157173
@DisplayName("test execute: should execute plugin")
158174
void testExecutePlugin() {
159175
var plugin = Mockito.spy(new DummyPlugin());
160176

161177
var config = new TaskConfiguration();
162178
config.setName("mytask");
179+
config.setType("dummy-type");
163180
config.setPhases(List.of("myphase"));
164181

165182
var entityConfig = new EntityConfiguration();
@@ -176,10 +193,27 @@ void testExecutePlugin() {
176193
Mockito.verify(plugin).execute(Mockito.any(), Mockito.eq(entity), Mockito.any());
177194
}
178195

196+
@Test
197+
@DisplayName("test execute: should not throw when tasks list is null")
198+
void testExecuteWithNullTasks() {
199+
var entityConfig = new EntityConfiguration();
200+
entityConfig.setTasks(null);
201+
202+
var entity = Mockito.mock(DynamicEntity.class);
203+
Mockito.when(entity.getConfiguration()).thenReturn(entityConfig);
204+
205+
// Should not throw NullPointerException
206+
taskEngine.execute(entity, new TaskExecutionContext(), "myphase");
207+
208+
// Verify no plugin interaction occurred
209+
Mockito.verifyNoInteractions(taskRegistry);
210+
Mockito.verifyNoInteractions(configurationService);
211+
}
212+
179213
public static class DummyPlugin implements TaskPlugin {
180214
@Override
181-
public boolean supports(@NonNull String name) {
182-
return "mytask".equals(name);
215+
public boolean supports(@NonNull String type) {
216+
return "dummy-type".equals(type);
183217
}
184218

185219
@Override

0 commit comments

Comments
 (0)