Skip to content

Commit

Permalink
test containers
Browse files Browse the repository at this point in the history
  • Loading branch information
Dariusz Czajkiewicz committed Feb 24, 2025
1 parent e351a66 commit 248e8be
Show file tree
Hide file tree
Showing 10 changed files with 56 additions and 39 deletions.
10 changes: 9 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,15 @@ This repository includes:
Easy adoption, ready-to-use assets, skilled workforce, years of collective experience, skilled architects



## Mr. Checker Test Containers support
***Docker environment is needed to run TestContainers***
* Running tests with Test Containers requires:
* Adding container to resources in **MyTestResources** class
* Extending test with the **BaseContainersTest**
* Using Mock server
* Mock server starts as part of TestContainers tests
* Mocking server rules can be set in the **MyMockServerClient** class
* Examples included in the **MyMockServerClient** class



Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.capgemini.framework.playwright.containers;
package com.capgemini.framework.playwright.base;

import com.capgemini.framework.playwright.BaseTest;
import com.capgemini.infrastructure.resources.MyTestResources;
import com.capgemini.framework.playwright.infrastructure.resources.MyTestResources;
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;
import org.testcontainers.junit.jupiter.Testcontainers;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.capgemini.infrastructure;
package com.capgemini.framework.playwright.infrastructure;

import com.capgemini.infrastructure.resources.MyMockServer;
import com.capgemini.framework.playwright.infrastructure.resources.containers.MyMockServer;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.microprofile.config.Config;
import org.eclipse.microprofile.config.ConfigProvider;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.capgemini.infrastructure.network;
package com.capgemini.framework.playwright.infrastructure.network;

import com.capgemini.infrastructure.Configuration;
import com.capgemini.framework.playwright.infrastructure.Configuration;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import org.testcontainers.DockerClientFactory;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.capgemini.infrastructure.resources;
package com.capgemini.framework.playwright.infrastructure.resources;

import com.capgemini.infrastructure.Configuration;
import com.capgemini.infrastructure.network.TestNetwork;
import com.capgemini.framework.playwright.infrastructure.Configuration;
import com.capgemini.framework.playwright.infrastructure.network.TestNetwork;
import com.capgemini.framework.playwright.infrastructure.resources.containers.MyMockServer;
import com.capgemini.framework.playwright.infrastructure.resources.containers.MyMockServerClient;
import com.capgemini.framework.playwright.infrastructure.resources.containers.RawmindWebContainer;
import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;
import org.testcontainers.DockerClientFactory;
import org.testcontainers.containers.GenericContainer;
Expand All @@ -11,7 +14,6 @@
import java.util.Map;

public class MyTestResources implements QuarkusTestResourceLifecycleManager {
// private final Network network = TestNetwork.getInstance().getNetwork();
private final Network network = TestNetwork.createReusableNetwork();
private RawmindWebContainer rawmindWebContainer = null;
private MyMockServer myMockServer = null;
Expand All @@ -28,14 +30,12 @@ public Map<String, String> start() {
}

private void startMockServer() {
if (myMockServer == null || !isContainerRunning(Configuration.MY_MOCK_NAME)) {
if (myMockServer == null || isContainerNotRunning(Configuration.MY_MOCK_NAME)) {
myMockServer = new MyMockServer(network);
if (!myMockServer.isRunning()) {
myMockServer.start();
}
if (!myMockServer.getContainerName().contains(Configuration.MY_MOCK_NAME)) {
myMockServer.withCreateContainerCmdModifier(cmd -> cmd.withName(Configuration.MY_MOCK_NAME));
}
renameContainerIfNeeded(myMockServer, Configuration.MY_MOCK_NAME);
}
Configuration.getInstance().setMyMockServer(myMockServer);
}
Expand All @@ -45,24 +45,28 @@ private void startMockClient() {
}

private void startWebServer() {
if (rawmindWebContainer == null || !isContainerRunning(Configuration.MY_WEB_APP_NAME)) {
if (rawmindWebContainer == null || isContainerNotRunning(Configuration.MY_WEB_APP_NAME)) {
rawmindWebContainer = new RawmindWebContainer(network);
if (!rawmindWebContainer.isRunning()) {
rawmindWebContainer.start();
}
if (!rawmindWebContainer.getContainerName().contains(Configuration.MY_WEB_APP_NAME)) {
rawmindWebContainer.withCreateContainerCmdModifier(cmd -> cmd.withName(Configuration.MY_WEB_APP_NAME));
}
renameContainerIfNeeded(rawmindWebContainer, Configuration.MY_WEB_APP_NAME);
}
Configuration.getInstance().setMyWebAppUrl(rawmindWebContainer.getUrl());
}

private boolean isContainerRunning(String containerName) {
private void renameContainerIfNeeded(GenericContainer<?> container, String containerName) {
if (container.getContainerName().contains(containerName)) {
container.withCreateContainerCmdModifier(cmd -> cmd.withName(containerName));
}
}

private boolean isContainerNotRunning(String containerName) {
return DockerClientFactory.instance().client().listContainersCmd()
.withShowAll(true)
.exec()
.stream()
.anyMatch(container -> container.getNames()[0].contains(containerName));
.noneMatch(container -> container.getNames()[0].contains(containerName));
}

@Override
Expand All @@ -73,7 +77,7 @@ public void stop() {
}
}

private void stopContainer(GenericContainer container) {
private void stopContainer(GenericContainer<?> container) {
if (container != null) {
container.stop();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.capgemini.infrastructure.resources;
package com.capgemini.framework.playwright.infrastructure.resources.containers;

import com.capgemini.infrastructure.Configuration;
import com.capgemini.framework.playwright.infrastructure.Configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.MockServerContainer;
import org.testcontainers.containers.Network;
import org.testcontainers.utility.DockerImageName;
Expand All @@ -11,16 +13,20 @@

public class MyMockServer extends MockServerContainer {
private static final String NETWORK_ALIAS = "mock-server";
private static final Logger log = LoggerFactory.getLogger(MyMockServer.class);

public MyMockServer(Network network) {
super(DockerImageName.parse("mockserver/mockserver"));

withReuse(Configuration.DEBUG);
withNetwork(network)
.withNetworkAliases(NETWORK_ALIAS)
.withNetworkMode(Configuration.MY_TEST_NETWORK_NAME)
.withLabel("reuse-id", Configuration.MY_MOCK_NAME)
.withExposedPorts(1080)
.withStartupTimeout(Duration.ofMinutes(2));
.withStartupTimeout(Duration.ofMinutes(2))
.withEnv("mockserver.logLevel", "none")
.withLogConsumer(containerLog -> log.info(containerLog.getUtf8String()));
withCreateContainerCmdModifier(cmd -> cmd.withName(Configuration.MY_MOCK_NAME));
setPortBindings(Arrays.asList("1080:1080"));
}
Expand All @@ -30,6 +36,7 @@ public MyMockServer withReuse(boolean reusable) {
if (reusable) {
var aliases = new ArrayList<String>();
aliases.add(NETWORK_ALIAS);
aliases.add(Configuration.MY_MOCK_NAME);
this.setNetworkAliases(aliases);
}
return (MyMockServer) super.withReuse(reusable);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.capgemini.infrastructure.resources;
package com.capgemini.framework.playwright.infrastructure.resources.containers;

import com.capgemini.infrastructure.Configuration;
import com.capgemini.framework.playwright.infrastructure.Configuration;
import org.mockserver.client.MockServerClient;
import org.mockserver.matchers.TimeToLive;
import org.mockserver.matchers.Times;
Expand Down Expand Up @@ -32,11 +32,11 @@ public static MyMockServerClient getInstance() {
}

public void startMockClient() {
// Dashboard link: http://localhost:1080/mockserver/dashboard
try {
mockServerClient = new MockServerClient(mockServer.getHost(), mockServer.getServerPort());

// Add rule by file
// http://localhost:1080/mockserver/dashboard
// Add rule by file with response
// http://localhost:1080/my-api/sample-1
addRule("/my-api/sample-1", "sample-mock-response-1.json");
addRule("/my-api/sample-2", "sample-mock-response-2.json");
Expand All @@ -49,6 +49,7 @@ public void startMockClient() {
));

// Add text response
// http://localhost:1080/my-api/sample-text-4
addRuleTxt("/my-api/sample-text-4", "Fourth sample response");

logger.info("Mock URL: {}:{}", mockServer.getHost(), mockServer.getServerPort());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
package com.capgemini.infrastructure.resources;
package com.capgemini.framework.playwright.infrastructure.resources.containers;

import com.capgemini.infrastructure.Configuration;
import com.github.dockerjava.api.model.ExposedPort;
import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.PortBinding;
import com.github.dockerjava.api.model.Ports;
import com.capgemini.framework.playwright.infrastructure.Configuration;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.Network;
import org.testcontainers.containers.wait.strategy.Wait;
Expand All @@ -29,7 +25,7 @@ public RawmindWebContainer(Network network) {
.waitingFor(Wait.forLogMessage(".*Running web-test service.*", 1))
.withStartupTimeout(java.time.Duration.ofSeconds(20));
withCreateContainerCmdModifier(cmd -> cmd.withName(Configuration.MY_WEB_APP_NAME));
setPortBindings(Arrays.asList("8080:8080"));
setPortBindings(Arrays.asList(APP_PORT+":"+APP_PORT));
logger().info("RawmindWebContainer starting...");
}

Expand All @@ -42,6 +38,7 @@ public RawmindWebContainer withReuse(boolean reusable) {
if (reusable) {
var aliases = new ArrayList<String>();
aliases.add(NETWORK_ALIAS);
aliases.add(Configuration.MY_WEB_APP_NAME);
this.setNetworkAliases(aliases);
}
return (RawmindWebContainer) super.withReuse(reusable);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.capgemini.frameworkExamples;

import com.capgemini.framework.enums.PrjEpics;
import com.capgemini.framework.playwright.containers.BaseContainersTest;
import com.capgemini.framework.playwright.base.BaseContainersTest;
import com.capgemini.framework.tags.Status;
import com.capgemini.frameworkExamples.page.TestContainersDemoPage;
import io.qameta.allure.Description;
Expand All @@ -17,7 +17,7 @@
@QuarkusTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class DemoWebContainersTest extends BaseContainersTest {
private TestContainersDemoPage testContainersDemoPage = new TestContainersDemoPage();
private final TestContainersDemoPage testContainersDemoPage = new TestContainersDemoPage();

@TmsLink("Test Management System ID")
@Epic(PrjEpics.EXAMPLES)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.capgemini.frameworkExamples.page;

import com.capgemini.framework.logger.AllureStepLogger;
import com.capgemini.infrastructure.Configuration;
import com.capgemini.framework.playwright.infrastructure.Configuration;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.options.AriaRole;
import org.slf4j.Logger;
Expand Down

0 comments on commit 248e8be

Please sign in to comment.