Skip to content

Commit e8ff946

Browse files
authored
Merge pull request #2135 from beyonnex-io/fix-definition-migration-test
fix migrateExistingThing test using mock
2 parents f877f95 + 878572c commit e8ff946

File tree

1 file changed

+44
-21
lines changed

1 file changed

+44
-21
lines changed

things/service/src/test/java/org/eclipse/ditto/things/service/persistence/actors/strategies/commands/MigrateThingDefinitionStrategyTest.java

+44-21
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414

1515
import static org.eclipse.ditto.things.model.TestConstants.Thing.THING_V2;
1616

17+
import java.lang.reflect.Field;
1718
import java.util.Collections;
19+
import java.util.Optional;
20+
import java.util.concurrent.CompletableFuture;
1821

1922
import org.apache.pekko.actor.ActorSystem;
2023
import org.eclipse.ditto.base.model.headers.DittoHeaders;
@@ -29,22 +32,29 @@
2932
import org.eclipse.ditto.things.model.signals.commands.modify.MigrateThingDefinitionResponse;
3033
import org.eclipse.ditto.things.model.signals.events.ThingDefinitionMigrated;
3134
import org.eclipse.ditto.things.service.persistence.actors.ETagTestUtils;
35+
import org.eclipse.ditto.wot.api.generator.WotThingSkeletonGenerator;
3236
import org.junit.Before;
3337
import org.junit.Test;
3438

3539
import com.typesafe.config.ConfigFactory;
3640

41+
import org.mockito.Mockito;
42+
3743
/**
38-
* Unit test for {@link MigrateThingDefinitionStrategy} with injected mock of WotThingSkeletonGenerator.
44+
* Unit test for {@link MigrateThingDefinitionStrategy}, verifying correct behavior when using a mocked {@link WotThingSkeletonGenerator}.
3945
*/
4046
public final class MigrateThingDefinitionStrategyTest extends AbstractCommandStrategyTest {
4147

48+
private static final String TEST_THING_DEFINITION_URL = "https://mock-model-1.0.0.tm.jsonld";
49+
4250
private MigrateThingDefinitionStrategy underTest;
51+
private final WotThingSkeletonGenerator skeletonGeneratorMock = Mockito.mock(WotThingSkeletonGenerator.class);
4352

4453
@Before
45-
public void setUp() {
54+
public void setUp() throws Exception {
4655
final ActorSystem actorSystem = ActorSystem.create("test", ConfigFactory.load("test"));
4756
underTest = new MigrateThingDefinitionStrategy(actorSystem);
57+
injectSkeletonGeneratorMock(underTest, skeletonGeneratorMock);
4858
}
4959

5060
@Test
@@ -53,36 +63,50 @@ public void migrateExistingThing() {
5363
final ThingId thingId = context.getState();
5464
final Thing existingThing = THING_V2.toBuilder().setRevision(NEXT_REVISION - 1).build();
5565

56-
final JsonObject migrationPayload = JsonFactory.newObjectBuilder()
57-
.set("attributes", JsonFactory.newObjectBuilder().set("manufacturer", "New Corp").build())
58-
.build();
66+
final Thing skeletonThing = ThingsModelFactory.newThing(getExpectedThingJson());
5967

60-
final String thingDefinitionUrl =
61-
"https://eclipse.dev/ditto/wot/example-models/dimmable-colored-lamp-1.0.0.tm.jsonld";
68+
Mockito.when(skeletonGeneratorMock.provideThingSkeletonForCreation(Mockito.any(), Mockito.any(), Mockito.any()))
69+
.thenReturn(CompletableFuture.completedFuture(Optional.of(skeletonThing)));
6270

6371
final MigrateThingDefinition command = MigrateThingDefinition.of(
6472
thingId,
65-
thingDefinitionUrl,
66-
migrationPayload,
73+
TEST_THING_DEFINITION_URL,
74+
JsonObject.empty(),
6775
Collections.emptyMap(),
6876
true,
6977
DittoHeaders.empty()
7078
);
7179

72-
final MigrateThingDefinitionResponse expectedResponse = ETagTestUtils.migrateThingDefinitionResponse(thingId,
73-
getThingJson(thingDefinitionUrl),
74-
getMergedThing(thingDefinitionUrl),
75-
command.getDittoHeaders());
80+
final MigrateThingDefinitionResponse expectedResponse = ETagTestUtils.migrateThingDefinitionResponse(
81+
thingId,
82+
getExpectedThingJson(),
83+
getExpectedMergedThing(),
84+
command.getDittoHeaders()
85+
);
86+
87+
assertStagedModificationResult(underTest, existingThing, command, ThingDefinitionMigrated.class, expectedResponse);
88+
}
7689

77-
assertStagedModificationResult(underTest, existingThing, command, ThingDefinitionMigrated.class,
78-
expectedResponse);
90+
private void injectSkeletonGeneratorMock(final MigrateThingDefinitionStrategy strategy,
91+
final WotThingSkeletonGenerator skeletonGeneratorMock) throws Exception {
92+
Class<?> clazz = strategy.getClass();
93+
while (clazz != null && !clazz.equals(Object.class)) {
94+
try {
95+
final Field field = clazz.getDeclaredField("wotThingSkeletonGenerator");
96+
field.setAccessible(true);
97+
field.set(strategy, skeletonGeneratorMock);
98+
return;
99+
} catch (final NoSuchFieldException e) {
100+
clazz = clazz.getSuperclass();
101+
}
102+
}
103+
throw new NoSuchFieldException("wotThingSkeletonGenerator not found in class hierarchy");
79104
}
80105

81-
private static JsonObject getThingJson(String thingDefinitionUrl) {
106+
private static JsonObject getExpectedThingJson() {
82107
return JsonFactory.newObjectBuilder()
83-
.set("definition", thingDefinitionUrl)
108+
.set("definition", TEST_THING_DEFINITION_URL)
84109
.set("attributes", JsonFactory.newObjectBuilder()
85-
.set("manufacturer", "New Corp")
86110
.set("on", false)
87111
.set("color", JsonFactory.newObjectBuilder()
88112
.set("r", 0)
@@ -94,9 +118,8 @@ private static JsonObject getThingJson(String thingDefinitionUrl) {
94118
.build();
95119
}
96120

97-
98-
private Thing getMergedThing(final String thingDefinitionUrl) {
99-
return ThingsModelFactory.newThingBuilder(getThingJson(thingDefinitionUrl))
121+
private Thing getExpectedMergedThing() {
122+
return ThingsModelFactory.newThingBuilder(getExpectedThingJson())
100123
.setRevision(ThingRevision.newInstance(NEXT_REVISION))
101124
.build();
102125
}

0 commit comments

Comments
 (0)