From 61d2169a519d44651f471fa49eba398c83e4d03f Mon Sep 17 00:00:00 2001 From: John Niang Date: Mon, 27 Jun 2022 00:04:09 +0800 Subject: [PATCH] Add additional method to fetch Extension by GVK and name (#2190) --- .../app/extension/DefaultExtensionClient.java | 9 +++- .../halo/app/extension/ExtensionClient.java | 2 + .../run/halo/app/extension/Unstructured.java | 17 +++++++ .../extension/DefaultExtensionClientTest.java | 48 ++++++++++++++++++- .../extension/ExtensionCreateHandlerTest.java | 3 +- .../extension/ExtensionDeleteHandlerTest.java | 3 +- .../extension/ExtensionUpdateHandlerTest.java | 3 +- .../halo/app/extension/UnstructuredTest.java | 28 +++++++++-- 8 files changed, 103 insertions(+), 10 deletions(-) diff --git a/src/main/java/run/halo/app/extension/DefaultExtensionClient.java b/src/main/java/run/halo/app/extension/DefaultExtensionClient.java index f46fab592..95ba8e030 100644 --- a/src/main/java/run/halo/app/extension/DefaultExtensionClient.java +++ b/src/main/java/run/halo/app/extension/DefaultExtensionClient.java @@ -62,8 +62,15 @@ public class DefaultExtensionClient implements ExtensionClient { @Override public Optional fetch(Class type, String name) { - var scheme = schemeManager.get(type); + return fetch(schemeManager.get(type), name, type); + } + @Override + public Optional fetch(GroupVersionKind gvk, String name) { + return fetch(schemeManager.get(gvk), name, Unstructured.class); + } + + private Optional fetch(Scheme scheme, String name, Class type) { var storeName = ExtensionUtil.buildStoreName(scheme, name); return storeClient.fetchByName(storeName) .map(extensionStore -> converter.convertFrom(type, extensionStore)); diff --git a/src/main/java/run/halo/app/extension/ExtensionClient.java b/src/main/java/run/halo/app/extension/ExtensionClient.java index a2bf4a455..3027a2cd1 100644 --- a/src/main/java/run/halo/app/extension/ExtensionClient.java +++ b/src/main/java/run/halo/app/extension/ExtensionClient.java @@ -50,6 +50,8 @@ public interface ExtensionClient { */ Optional fetch(Class type, String name); + Optional fetch(GroupVersionKind gvk, String name); + /** * Creates an Extension. diff --git a/src/main/java/run/halo/app/extension/Unstructured.java b/src/main/java/run/halo/app/extension/Unstructured.java index 86256f742..a53d0fc2a 100644 --- a/src/main/java/run/halo/app/extension/Unstructured.java +++ b/src/main/java/run/halo/app/extension/Unstructured.java @@ -14,6 +14,7 @@ import java.time.Instant; import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -219,4 +220,20 @@ public class Unstructured implements Extension { } } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Unstructured that = (Unstructured) o; + return Objects.equals(data, that.data); + } + + @Override + public int hashCode() { + return Objects.hash(data); + } } diff --git a/src/test/java/run/halo/app/extension/DefaultExtensionClientTest.java b/src/test/java/run/halo/app/extension/DefaultExtensionClientTest.java index 862c2c6db..975bd44cc 100644 --- a/src/test/java/run/halo/app/extension/DefaultExtensionClientTest.java +++ b/src/test/java/run/halo/app/extension/DefaultExtensionClientTest.java @@ -9,10 +9,13 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isA; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static run.halo.app.extension.GroupVersionKind.fromAPIVersionAndKind; +import static run.halo.app.extension.Scheme.buildFromType; import com.fasterxml.jackson.core.JsonProcessingException; import java.util.List; @@ -32,6 +35,8 @@ import run.halo.app.extension.store.ExtensionStoreClient; @ExtendWith(MockitoExtension.class) class DefaultExtensionClientTest { + static final Scheme fakeScheme = Scheme.buildFromType(FakeExtension.class); + @Mock ExtensionStoreClient storeClient; @@ -47,7 +52,7 @@ class DefaultExtensionClientTest { @BeforeEach void setUp() { lenient().when(schemeManager.get(eq(FakeExtension.class))) - .thenReturn(Scheme.buildFromType(FakeExtension.class)); + .thenReturn(buildFromType(FakeExtension.class)); } FakeExtension createFakeExtension(String name, Long version) { @@ -93,6 +98,11 @@ class DefaultExtensionClientTest { return Unstructured.OBJECT_MAPPER.readValue(extensionJson, Unstructured.class); } + @Test + void shouldFetchUnstructuredSuccessfully() { + + } + @Test void shouldThrowSchemeNotFoundExceptionWhenSchemeNotRegistered() { class UnRegisteredExtension extends AbstractExtension { @@ -100,6 +110,8 @@ class DefaultExtensionClientTest { when(schemeManager.get(eq(UnRegisteredExtension.class))) .thenThrow(SchemeNotFoundException.class); + when(schemeManager.get(isA(GroupVersionKind.class))) + .thenThrow(SchemeNotFoundException.class); assertThrows(SchemeNotFoundException.class, () -> client.list(UnRegisteredExtension.class, null, null)); @@ -107,6 +119,8 @@ class DefaultExtensionClientTest { () -> client.page(UnRegisteredExtension.class, null, null, 0, 10)); assertThrows(SchemeNotFoundException.class, () -> client.fetch(UnRegisteredExtension.class, "fake")); + assertThrows(SchemeNotFoundException.class, () -> + client.fetch(fromAPIVersionAndKind("fake.halo.run/v1alpha1", "UnRegistered"), "fake")); assertThrows(SchemeNotFoundException.class, () -> { when(converter.convertTo(any())).thenThrow(SchemeNotFoundException.class); client.create(createFakeExtension("fake", null)); @@ -210,6 +224,19 @@ class DefaultExtensionClientTest { verify(storeClient, times(1)).fetchByName(any()); } + @Test + void shouldNotFetchUnstructured() { + when(schemeManager.get(isA(GroupVersionKind.class))) + .thenReturn(fakeScheme); + when(storeClient.fetchByName(any())).thenReturn(Optional.empty()); + var unstructuredFake = client.fetch(fakeScheme.groupVersionKind(), "fake"); + + assertEquals(Optional.empty(), unstructuredFake); + verify(converter, times(0)).convertFrom(any(), any()); + verify(schemeManager, times(1)).get(isA(GroupVersionKind.class)); + verify(storeClient, times(1)).fetchByName(any()); + } + @Test void shouldFetchAnExtension() { var storeName = "/registry/fake.halo.run/fakes/fake"; @@ -228,6 +255,25 @@ class DefaultExtensionClientTest { eq(createExtensionStore(storeName))); } + @Test + void shouldFetchUnstructuredExtension() throws JsonProcessingException { + var storeName = "/registry/fake.halo.run/fakes/fake"; + when(storeClient.fetchByName(storeName)).thenReturn( + Optional.of(createExtensionStore(storeName))); + when(schemeManager.get(isA(GroupVersionKind.class))) + .thenReturn(fakeScheme); + when(converter.convertFrom(Unstructured.class, createExtensionStore(storeName))) + .thenReturn(createUnstructured()); + + var fake = client.fetch(fakeScheme.groupVersionKind(), "fake"); + + assertEquals(Optional.of(createUnstructured()), fake); + verify(storeClient, times(1)).fetchByName(eq(storeName)); + verify(schemeManager, times(1)).get(isA(GroupVersionKind.class)); + verify(converter, times(1)).convertFrom(eq(Unstructured.class), + eq(createExtensionStore(storeName))); + } + @Test void shouldCreateSuccessfully() { var fake = createFakeExtension("fake", null); diff --git a/src/test/java/run/halo/app/extension/ExtensionCreateHandlerTest.java b/src/test/java/run/halo/app/extension/ExtensionCreateHandlerTest.java index dcec929b6..2e40ffdd8 100644 --- a/src/test/java/run/halo/app/extension/ExtensionCreateHandlerTest.java +++ b/src/test/java/run/halo/app/extension/ExtensionCreateHandlerTest.java @@ -6,6 +6,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -107,6 +108,6 @@ class ExtensionCreateHandlerTest { .verifyError(ExtensionNotFoundException.class); verify(client, times(1)).create( argThat(extension -> Objects.equals("my-fake", extension.getMetadata().getName()))); - verify(client, times(0)).fetch(any(), anyString()); + verify(client, times(0)).fetch(same(FakeExtension.class), anyString()); } } diff --git a/src/test/java/run/halo/app/extension/ExtensionDeleteHandlerTest.java b/src/test/java/run/halo/app/extension/ExtensionDeleteHandlerTest.java index 7970aa261..3ed44a878 100644 --- a/src/test/java/run/halo/app/extension/ExtensionDeleteHandlerTest.java +++ b/src/test/java/run/halo/app/extension/ExtensionDeleteHandlerTest.java @@ -7,6 +7,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -99,7 +100,7 @@ class ExtensionDeleteHandlerTest { StepVerifier.create(responseMono) .verifyError(ExtensionNotFoundException.class); - verify(client, times(1)).fetch(any(), anyString()); + verify(client, times(1)).fetch(same(FakeExtension.class), anyString()); verify(client, times(0)).update(any()); verify(client, times(0)).delete(any()); } diff --git a/src/test/java/run/halo/app/extension/ExtensionUpdateHandlerTest.java b/src/test/java/run/halo/app/extension/ExtensionUpdateHandlerTest.java index d2764b6db..f44b58423 100644 --- a/src/test/java/run/halo/app/extension/ExtensionUpdateHandlerTest.java +++ b/src/test/java/run/halo/app/extension/ExtensionUpdateHandlerTest.java @@ -7,6 +7,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -119,6 +120,6 @@ class ExtensionUpdateHandlerTest { verify(client, times(1)).update( argThat(extension -> Objects.equals("my-fake", extension.getMetadata().getName()))); - verify(client, times(0)).fetch(any(), anyString()); + verify(client, times(0)).fetch(same(FakeExtension.class), anyString()); } } diff --git a/src/test/java/run/halo/app/extension/UnstructuredTest.java b/src/test/java/run/halo/app/extension/UnstructuredTest.java index 2d64b88d4..9729013a6 100644 --- a/src/test/java/run/halo/app/extension/UnstructuredTest.java +++ b/src/test/java/run/halo/app/extension/UnstructuredTest.java @@ -1,6 +1,7 @@ package run.halo.app.extension; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static run.halo.app.extension.MetadataOperator.metadataDeepEquals; @@ -46,7 +47,6 @@ class UnstructuredTest { Map extensionMap = objectMapper.readValue(extensionJson, Map.class); var extension = new Unstructured(extensionMap); - System.out.println(objectMapper.writeValueAsString(extension)); var beforeChange = objectMapper.writeValueAsString(extension); var metadata = extension.getMetadata(); @@ -75,16 +75,34 @@ class UnstructuredTest { @Test void shouldSetExtensionCorrectly() { - var extension = new Unstructured(); - extension.setApiVersion("fake.halo.run/v1alpha1"); - extension.setKind("Fake"); - extension.setMetadata(createMetadata()); + var extension = createUnstructured(); assertEquals("fake.halo.run/v1alpha1", extension.getApiVersion()); assertEquals("Fake", extension.getKind()); assertTrue(metadataDeepEquals(createMetadata(), extension.getMetadata())); } + @Test + void shouldBeEqual() { + assertEquals(new Unstructured(), new Unstructured()); + assertEquals(createUnstructured(), createUnstructured()); + } + + @Test + void shouldNotBeEqual() { + var another = createUnstructured(); + another.getMetadata().setName("fake-extension-2"); + assertNotEquals(createUnstructured(), another); + } + + Unstructured createUnstructured() { + var unstructured = new Unstructured(); + unstructured.setApiVersion("fake.halo.run/v1alpha1"); + unstructured.setKind("Fake"); + unstructured.setMetadata(createMetadata()); + return unstructured; + } + private Metadata createMetadata() { var metadata = new Metadata(); metadata.setName("fake-extension");