Add additional method to fetch Extension by GVK and name (#2190)

pull/2191/head
John Niang 2022-06-27 00:04:09 +08:00 committed by GitHub
parent c0758f32d1
commit 61d2169a51
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 103 additions and 10 deletions

View File

@ -62,8 +62,15 @@ public class DefaultExtensionClient implements ExtensionClient {
@Override
public <E extends Extension> Optional<E> fetch(Class<E> type, String name) {
var scheme = schemeManager.get(type);
return fetch(schemeManager.get(type), name, type);
}
@Override
public Optional<Unstructured> fetch(GroupVersionKind gvk, String name) {
return fetch(schemeManager.get(gvk), name, Unstructured.class);
}
private <E extends Extension> Optional<E> fetch(Scheme scheme, String name, Class<E> type) {
var storeName = ExtensionUtil.buildStoreName(scheme, name);
return storeClient.fetchByName(storeName)
.map(extensionStore -> converter.convertFrom(type, extensionStore));

View File

@ -50,6 +50,8 @@ public interface ExtensionClient {
*/
<E extends Extension> Optional<E> fetch(Class<E> type, String name);
Optional<Unstructured> fetch(GroupVersionKind gvk, String name);
/**
* Creates an Extension.

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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());
}
}

View File

@ -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());
}

View File

@ -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());
}
}

View File

@ -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");