Skip to content

Commit

Permalink
Merge pull request #1582 from eddumelendez
Browse files Browse the repository at this point in the history
* pr/1582:
  Polish "Generate test app when spring cloud azure storage is selected"
  Generate test app when spring cloud azure storage is selected

Closes gh-1582
  • Loading branch information
mhalbritter committed Sep 13, 2024
2 parents ddf254a + 4400544 commit d33a2c4
Show file tree
Hide file tree
Showing 7 changed files with 256 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public SimpleDockerServiceResolver() {
this.dockerServices.put("activeMQ", activeMQ());
this.dockerServices.put("activeMQClassic", activeMQClassic());
this.dockerServices.put("artemis", artemis());
this.dockerServices.put("azurite", azurite());
this.dockerServices.put("cassandra", cassandra());
this.dockerServices.put("chroma", chroma());
this.dockerServices.put("elasticsearch", elasticsearch());
Expand Down Expand Up @@ -81,6 +82,13 @@ private static DockerService artemis() {
.build();
}

private static DockerService azurite() {
return DockerService.withImageAndTag("mcr.microsoft.com/azure-storage/azurite")
.website("https://github.com/Azure/Azurite?tab=readme-ov-file#dockerhub")
.ports(10000, 10001, 10002)
.build();
}

private static DockerService cassandra() {
return DockerService.withImageAndTag("cassandra")
.website("https://hub.docker.com/_/cassandra")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* Copyright 2012-2024 the original author or authors.
*
* 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
*
* https://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.spring.start.site.extension.dependency.springazure;

import io.spring.initializr.generator.buildsystem.Build;
import io.spring.initializr.generator.buildsystem.Dependency;
import io.spring.initializr.generator.buildsystem.DependencyScope;
import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem;
import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem;
import io.spring.initializr.generator.condition.ConditionalOnBuildSystem;
import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency;
import io.spring.initializr.generator.project.ProjectGenerationConfiguration;
import io.spring.initializr.generator.spring.build.BuildCustomizer;
import io.spring.initializr.generator.spring.build.gradle.DevelopmentOnlyDependencyGradleBuildCustomizer;
import io.spring.initializr.generator.spring.build.maven.OptionalDependencyMavenBuildCustomizer;
import io.spring.start.site.container.ComposeFileCustomizer;
import io.spring.start.site.container.DockerServiceResolver;

import org.springframework.context.annotation.Bean;

/**
* Configuration for generation of projects that depend on Spring Azure Docker Compose.
*
* @author Eddú Meléndez
* @author Moritz Halbritter
*/
@ProjectGenerationConfiguration
@ConditionalOnRequestedDependency("azure-storage")
class SpringAzureDockerComposeProjectGenerationConfiguration {

private static final String DEPENDENCY_ID = "spring-azure-docker-compose";

@Bean
@ConditionalOnRequestedDependency("docker-compose")
BuildCustomizer<Build> springAzureDockerComposeBuildCustomizer() {
return (build) -> build.dependencies()
.add(DEPENDENCY_ID, Dependency.withCoordinates("com.azure.spring", "spring-cloud-azure-docker-compose")
.scope(DependencyScope.RUNTIME));
}

@Bean
@ConditionalOnBuildSystem(MavenBuildSystem.ID)
OptionalDependencyMavenBuildCustomizer springAzureDockerComposeMavenBuildCustomizer() {
return new OptionalDependencyMavenBuildCustomizer(DEPENDENCY_ID);
}

@Bean
@ConditionalOnBuildSystem(GradleBuildSystem.ID)
DevelopmentOnlyDependencyGradleBuildCustomizer springAzureDockerComposeGradleBuildCustomizer() {
return new DevelopmentOnlyDependencyGradleBuildCustomizer(DEPENDENCY_ID);
}

@Bean
@ConditionalOnRequestedDependency("docker-compose")
ComposeFileCustomizer azureStorageComposeFileCustomizer(DockerServiceResolver serviceResolver) {
return (composeFile) -> serviceResolver.doWith("azurite",
(service) -> composeFile.services().add("azurite", service));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*
* Copyright 2012-2024 the original author or authors.
*
* 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
*
* https://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.spring.start.site.extension.dependency.springazure;

import io.spring.initializr.generator.buildsystem.Build;
import io.spring.initializr.generator.buildsystem.Dependency;
import io.spring.initializr.generator.buildsystem.DependencyScope;
import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency;
import io.spring.initializr.generator.project.ProjectGenerationConfiguration;
import io.spring.initializr.generator.spring.build.BuildCustomizer;
import io.spring.start.site.container.DockerServiceResolver;
import io.spring.start.site.container.ServiceConnections;
import io.spring.start.site.container.ServiceConnectionsCustomizer;

import org.springframework.context.annotation.Bean;

/**
* Configuration for generation of projects that depend on Spring Azure Testcontainers.
*
* @author Eddú Meléndez
*/
@ProjectGenerationConfiguration
@ConditionalOnRequestedDependency("azure-storage")
class SpringAzureTestcontainersProjectGenerationConfiguration {

@Bean
@ConditionalOnRequestedDependency("testcontainers")
BuildCustomizer<Build> springAzureTestcontainersBuildCustomizer() {
return (build) -> build.dependencies()
.add("spring-azure-testcontainers",
Dependency.withCoordinates("com.azure.spring", "spring-cloud-azure-testcontainers")
.scope(DependencyScope.TEST_COMPILE));
}

@Bean
@ConditionalOnRequestedDependency("testcontainers")
ServiceConnectionsCustomizer azureStorageServiceConnectionsCustomizer(DockerServiceResolver serviceResolver) {
return (serviceConnections) -> serviceResolver.doWith("azurite",
(service) -> serviceConnections.addServiceConnection(ServiceConnections.ServiceConnection
.ofGenericContainer("azurite", service, "azure-storage/azurite")));
}

}
2 changes: 2 additions & 0 deletions start-site/src/main/resources/META-INF/spring.factories
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ io.spring.start.site.extension.dependency.springai.SpringAiQdrantProjectGenerati
io.spring.start.site.extension.dependency.springai.SpringAiTestcontainersProjectGenerationConfiguration,\
io.spring.start.site.extension.dependency.springai.SpringAiWeaviateProjectGenerationConfiguration,\
io.spring.start.site.extension.dependency.springamqp.SpringAmqpProjectGenerationConfiguration,\
io.spring.start.site.extension.dependency.springazure.SpringAzureDockerComposeProjectGenerationConfiguration,\
io.spring.start.site.extension.dependency.springazure.SpringAzureProjectGenerationConfiguration,\
io.spring.start.site.extension.dependency.springazure.SpringAzureTestcontainersProjectGenerationConfiguration,\
io.spring.start.site.extension.dependency.springboot.SpringBootProjectGenerationConfiguration,\
io.spring.start.site.extension.dependency.springcloud.SpringCloudProjectGenerationConfiguration,\
io.spring.start.site.extension.dependency.springdata.SpringDataProjectGenerationConfiguration,\
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*
* Copyright 2012-2024 the original author or authors.
*
* 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
*
* https://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.spring.start.site.extension.dependency.springazure;

import io.spring.initializr.generator.test.project.ProjectStructure;
import io.spring.initializr.web.project.ProjectRequest;
import io.spring.start.site.extension.AbstractExtensionTests;
import org.junit.jupiter.api.Test;

import org.springframework.core.io.ClassPathResource;

import static org.assertj.core.api.Assertions.assertThat;

/**
* Tests for {@link SpringAzureDockerComposeProjectGenerationConfiguration}.
*
* @author Eddú Meléndez
*/
class SpringAzureDockerComposeProjectGenerationConfigurationTests extends AbstractExtensionTests {

@Test
void doesNothingWithoutDockerCompose() {
ProjectRequest request = createProjectRequest("web", "azure-storage");
ProjectStructure structure = generateProject(request);
assertThat(structure.getProjectDirectory().resolve("compose.yaml")).doesNotExist();
}

@Test
void createsAzuriteService() {
ProjectRequest request = createProjectRequest("docker-compose", "azure-storage");
assertThat(composeFile(request)).hasSameContentAs(new ClassPathResource("compose/azurite.yaml"));
}

@Test
void springAzureDockerComposeDependencyIsAdded() {
ProjectRequest projectRequest = createProjectRequest("docker-compose", "azure-storage");
assertThat(mavenPom(projectRequest)).hasDependency("com.azure.spring", "spring-cloud-azure-docker-compose",
null, "runtime");
}

@Test
void shouldNotAddDockerComposeTestcontainersDependencyIfNoSpringAzureDependencyIsSelected() {
ProjectRequest projectRequest = createProjectRequest("docker-compose", "web");
assertThat(mavenPom(projectRequest)).doesNotHaveDependency("com.azure.spring",
"spring-cloud-azure-docker-compose");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright 2012-2024 the original author or authors.
*
* 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
*
* https://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.spring.start.site.extension.dependency.springazure;

import io.spring.initializr.web.project.ProjectRequest;
import io.spring.start.site.extension.AbstractExtensionTests;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

/**
* Tests for {@link SpringAzureTestcontainersProjectGenerationConfiguration}.
*
* @author Eddú Meléndez
*/
class SpringAzureTestcontainersProjectGenerationConfigurationTests extends AbstractExtensionTests {

@Test
void springAzureTestcontainersDependencyIsAdded() {
ProjectRequest projectRequest = createProjectRequest("testcontainers", "azure-storage");
assertThat(mavenPom(projectRequest)).hasDependency("com.azure.spring", "spring-cloud-azure-testcontainers",
null, "test");
}

@Test
void shouldNotAddSpringAzureTestcontainersDependencyIfNoSpringAzureDependencyIsSelected() {
ProjectRequest projectRequest = createProjectRequest("testcontainers", "azure-keyvault");
assertThat(mavenPom(projectRequest)).doesNotHaveDependency("com.azure.spring",
"spring-cloud-azure-testcontainers");
}

}
7 changes: 7 additions & 0 deletions start-site/src/test/resources/compose/azurite.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
services:
azurite:
image: 'mcr.microsoft.com/azure-storage/azurite:latest'
ports:
- '10000'
- '10001'
- '10002'

0 comments on commit d33a2c4

Please sign in to comment.