Skip to content

Commit

Permalink
fix(service): deserialize primary owner entity for api template
Browse files Browse the repository at this point in the history
  • Loading branch information
jourdiw committed Mar 4, 2024
1 parent 40ae1df commit 3a383fc
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 5 deletions.
Expand Up @@ -39,7 +39,7 @@ public class ApiFreemarkerTemplate {
private ApiType type = ApiType.PROXY;

private String picture;
private PrimaryOwnerEntity primaryOwner;
private PrimaryOwnerApiTemplateData primaryOwner;

@Builder.Default
private Api.Visibility visibility = Api.Visibility.PRIVATE;
Expand Down Expand Up @@ -97,6 +97,6 @@ public ApiFreemarkerTemplate(Api api, Map<String, String> metadata, PrimaryOwner
}

this.metadata = metadata;
this.primaryOwner = primaryOwner;
this.primaryOwner = PrimaryOwnerApiTemplateData.from(primaryOwner);
}
}
@@ -0,0 +1,42 @@
/*
* Copyright © 2015 The Gravitee team (http://gravitee.io)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.gravitee.apim.core.documentation.model;

import io.gravitee.apim.core.membership.model.PrimaryOwnerEntity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

@Builder
@AllArgsConstructor
@Data
public class PrimaryOwnerApiTemplateData {

private String id;
private String displayName;
private String email;
private String type;

public static PrimaryOwnerApiTemplateData from(PrimaryOwnerEntity primaryOwner) {
return PrimaryOwnerApiTemplateData
.builder()
.id(primaryOwner.id())
.displayName(primaryOwner.displayName())
.email(primaryOwner.email())
.type(primaryOwner.type().name())
.build();
}
}
Expand Up @@ -54,7 +54,7 @@ void should_convert_v4_api_to_api_freemarker_template() {
soft.assertThat(api.getVisibility().toString()).isEqualTo(Visibility.PUBLIC.toString());
soft.assertThat(api.getVersion()).isEqualTo("1.0.0");
soft.assertThat(api.getMetadata()).isEqualTo(metadata);
soft.assertThat(api.getPrimaryOwner()).isEqualTo(primaryOwner);
soft.assertThat(api.getPrimaryOwner()).isEqualTo(PrimaryOwnerApiTemplateData.from(primaryOwner));
});
}

Expand Down Expand Up @@ -83,7 +83,7 @@ void should_convert_v2_api_to_repository() {
soft.assertThat(api.getVisibility().toString()).isEqualTo(Visibility.PUBLIC.toString());
soft.assertThat(api.getVersion()).isEqualTo("1.0.0");
soft.assertThat(api.getMetadata()).isEqualTo(metadata);
soft.assertThat(api.getPrimaryOwner()).isEqualTo(primaryOwner);
soft.assertThat(api.getPrimaryOwner()).isEqualTo(PrimaryOwnerApiTemplateData.from(primaryOwner));
});
}
}
Expand Up @@ -21,13 +21,20 @@
import io.gravitee.apim.core.api.model.Api;
import io.gravitee.apim.core.documentation.exception.InvalidPageContentException;
import io.gravitee.apim.core.documentation.model.ApiFreemarkerTemplate;
import io.gravitee.apim.core.documentation.model.PrimaryOwnerApiTemplateData;
import io.gravitee.apim.core.membership.model.PrimaryOwnerEntity;
import io.gravitee.definition.model.DefinitionVersion;
import io.gravitee.definition.model.Proxy;
import io.gravitee.definition.model.VirtualHost;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

class FreemarkerTemplateResolverTest {

Expand Down Expand Up @@ -84,12 +91,53 @@ void should_throw_exception_if_template_accesses_unknown_data() {

@Test
void should_throw_exception_if_template_accesses_unknown_property() {
Api api = Api.builder().id("id").name("api-name").version("1.0").build();
var api = ApiFreemarkerTemplate.builder().id("id").name("api-name").version("1.0").build();

var throwable = catchThrowable(() ->
resolver.resolveTemplate("Documentation for ${api.name} ${api.vvv} (${api.id})", Map.of("api", api))
);
assertThat(throwable).isInstanceOf(InvalidPageContentException.class);
assertThat(throwable.getCause().getMessage()).contains("api.vvv");
}

@ParameterizedTest
@MethodSource("provideParameters")
void should_render_api_fields(final String fieldName, final String output) {
var po = PrimaryOwnerApiTemplateData.from(
new PrimaryOwnerEntity("id", "po email", "po display name", PrimaryOwnerEntity.Type.USER)
);

var api = ApiFreemarkerTemplate
.builder()
.id("api-id")
.name("api-name")
.description("api description")
.version("v1000")
.picture("a lovely picture")
.state(Api.LifecycleState.STARTED)
.visibility(Api.Visibility.PUBLIC)
.tags(Set.of("first tag"))
.metadata(Map.of("meta", "data"))
.primaryOwner(po)
.build();

assertThat(resolver.resolveTemplate("This is my " + fieldName + ": ${api." + fieldName + "}", Map.of("api", api)))
.isEqualTo("This is my " + fieldName + ": " + output);
}

public static Stream<Arguments> provideParameters() {
return Stream.of(
Arguments.of("id", "api-id"),
Arguments.of("name", "api-name"),
Arguments.of("description", "api description"),
Arguments.of("version", "v1000"),
Arguments.of("metadata['meta']", "data"),
Arguments.of("picture", "a lovely picture"),
Arguments.of("state", "STARTED"),
Arguments.of("visibility", "PUBLIC"),
Arguments.of("tags[0]", "first tag"),
Arguments.of("primaryOwner.displayName", "po display name"),
Arguments.of("primaryOwner.email", "po email")
);
}
}

0 comments on commit 3a383fc

Please sign in to comment.