This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit bf2535a45e6a4270c1a7713a5a01b10104710190 Author: Benoit Tellier <[email protected]> AuthorDate: Sat Feb 13 10:50:48 2021 +0700 JAMES-3400 Add remove and list domain aliases --- server/protocols/webadmin-cli/README.md | 18 ++ server/protocols/webadmin-cli/pom.xml | 4 + .../java/org/apache/james/cli/WebAdminCli.java | 5 + ...mainCommand.java => AddDomainAliasCommand.java} | 54 +++--- .../org/apache/james/cli/domain/DomainCommand.java | 5 +- ...ainCommand.java => ListDomainAliasCommand.java} | 42 ++--- ...nCommand.java => RemoveDomainAliasCommand.java} | 51 ++--- .../org/apache/james/httpclient/DomainClient.java | 39 ++++ .../org/apache/james/cli/DomainManageTest.java | 206 ++++++++++++++------- 9 files changed, 283 insertions(+), 141 deletions(-) diff --git a/server/protocols/webadmin-cli/README.md b/server/protocols/webadmin-cli/README.md index b8b4235..0b45d48 100644 --- a/server/protocols/webadmin-cli/README.md +++ b/server/protocols/webadmin-cli/README.md @@ -124,6 +124,24 @@ Show all domains' name on the list. {cli} domain list ``` +### List domain aliases for a domain +Show all domains' name on the list. +``` +{cli} domain listAliases <domain> +``` + +### Create a domain alias for a domain + +``` +{cli} domain addAlias <domain> <sourceOfTheAlias> +``` + +### Remove a domain alias for a domain + +``` +{cli} domain removeAlias <domain> <sourceOfTheAlias> +``` + ## Manage Users diff --git a/server/protocols/webadmin-cli/pom.xml b/server/protocols/webadmin-cli/pom.xml index 49ec90e..bdfe312 100644 --- a/server/protocols/webadmin-cli/pom.xml +++ b/server/protocols/webadmin-cli/pom.xml @@ -59,6 +59,10 @@ <scope>test</scope> </dependency> <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + </dependency> + <dependency> <groupId>info.picocli</groupId> <artifactId>picocli</artifactId> <version>4.6.1</version> diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/WebAdminCli.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/WebAdminCli.java index 74b450c..02acc00 100644 --- a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/WebAdminCli.java +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/WebAdminCli.java @@ -20,6 +20,7 @@ package org.apache.james.cli; import java.io.PrintStream; +import java.util.Collection; import java.util.Optional; import java.util.concurrent.Callable; @@ -84,6 +85,10 @@ public class WebAdminCli implements Callable<Integer> { return execute(out, err, args); } + public static int executeFluent(PrintStream out, PrintStream err, Collection<String> args) { + return execute(out, err, args.stream().toArray(String[]::new)); + } + public Feign.Builder feignClientFactory(PrintStream err) { return new FeignClientFactory(new JwtToken(Optional.ofNullable(jwt), Optional.ofNullable(jwtFilePath), err)) diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainCommand.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/AddDomainAliasCommand.java similarity index 54% copy from server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainCommand.java copy to server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/AddDomainAliasCommand.java index ec38083..d669dfd 100644 --- a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainCommand.java +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/AddDomainAliasCommand.java @@ -19,42 +19,46 @@ package org.apache.james.cli.domain; -import java.io.PrintStream; +import java.nio.charset.StandardCharsets; import java.util.concurrent.Callable; +import org.apache.commons.io.IOUtils; import org.apache.james.cli.WebAdminCli; import org.apache.james.httpclient.DomainClient; +import feign.Response; import picocli.CommandLine; @CommandLine.Command( - name = "domain", - description = "Manage Domains", - subcommands = { - DomainListCommand.class, - DomainCreateCommand.class, - DomainDeleteCommand.class, - DomainExistCommand.class - }) -public class DomainCommand implements Callable<Integer> { - - protected final WebAdminCli webAdminCli; - protected final PrintStream out; - protected final PrintStream err; - - public DomainCommand(PrintStream out, WebAdminCli webAdminCli, PrintStream err) { - this.out = out; - this.webAdminCli = webAdminCli; - this.err = err; - } + name = "addAlias", + description = "Create a new domain alias") +public class AddDomainAliasCommand implements Callable<Integer> { + + public static final int CREATED_CODE = 204; + + @CommandLine.ParentCommand DomainCommand domainCommand; + + @CommandLine.Parameters(description = "Destination of the domain alias. This is the domain this alias belongs to.") + String destinationDomain; + + @CommandLine.Parameters(description = "Source of the domain alias.") + String sourceDomain; @Override public Integer call() { - return WebAdminCli.CLI_FINISHED_SUCCEED; - } - - public DomainClient fullyQualifiedURL(String partOfUrl) { - return webAdminCli.feignClientFactory(err).target(DomainClient.class, webAdminCli.jamesUrl + partOfUrl); + try { + DomainClient domainClient = domainCommand.fullyQualifiedURL("/domains"); + Response rs = domainClient.addADomainAlias(destinationDomain, sourceDomain); + if (rs.status() == CREATED_CODE) { + return WebAdminCli.CLI_FINISHED_SUCCEED; + } else { + domainCommand.err.println(IOUtils.toString(rs.body().asInputStream(), StandardCharsets.UTF_8)); + return WebAdminCli.CLI_FINISHED_FAILED; + } + } catch (Exception e) { + e.printStackTrace(domainCommand.err); + return WebAdminCli.CLI_FINISHED_FAILED; + } } } \ No newline at end of file diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainCommand.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainCommand.java index ec38083..1036ec5 100644 --- a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainCommand.java +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainCommand.java @@ -34,7 +34,10 @@ import picocli.CommandLine; DomainListCommand.class, DomainCreateCommand.class, DomainDeleteCommand.class, - DomainExistCommand.class + DomainExistCommand.class, + AddDomainAliasCommand.class, + ListDomainAliasCommand.class, + RemoveDomainAliasCommand.class }) public class DomainCommand implements Callable<Integer> { diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainCommand.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/ListDomainAliasCommand.java similarity index 63% copy from server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainCommand.java copy to server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/ListDomainAliasCommand.java index ec38083..79b6006 100644 --- a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainCommand.java +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/ListDomainAliasCommand.java @@ -19,7 +19,6 @@ package org.apache.james.cli.domain; -import java.io.PrintStream; import java.util.concurrent.Callable; import org.apache.james.cli.WebAdminCli; @@ -28,33 +27,26 @@ import org.apache.james.httpclient.DomainClient; import picocli.CommandLine; @CommandLine.Command( - name = "domain", - description = "Manage Domains", - subcommands = { - DomainListCommand.class, - DomainCreateCommand.class, - DomainDeleteCommand.class, - DomainExistCommand.class - }) -public class DomainCommand implements Callable<Integer> { + name = "listAliases", + description = "List domain aliases for a given domain") +public class ListDomainAliasCommand implements Callable<Integer> { + @CommandLine.ParentCommand DomainCommand domainCommand; - protected final WebAdminCli webAdminCli; - protected final PrintStream out; - protected final PrintStream err; - - public DomainCommand(PrintStream out, WebAdminCli webAdminCli, PrintStream err) { - this.out = out; - this.webAdminCli = webAdminCli; - this.err = err; - } + @CommandLine.Parameters + String domainName; @Override public Integer call() { - return WebAdminCli.CLI_FINISHED_SUCCEED; + try { + DomainClient domainClient = domainCommand.fullyQualifiedURL("/domains"); + domainClient.getDomainAliasList(domainName) + .stream() + .map(DomainClient.DomainAliasResponse::getSource) + .forEach(domainCommand.out::println); + return WebAdminCli.CLI_FINISHED_SUCCEED; + } catch (Exception e) { + e.printStackTrace(domainCommand.err); + return WebAdminCli.CLI_FINISHED_FAILED; + } } - - public DomainClient fullyQualifiedURL(String partOfUrl) { - return webAdminCli.feignClientFactory(err).target(DomainClient.class, webAdminCli.jamesUrl + partOfUrl); - } - } \ No newline at end of file diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainCommand.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/RemoveDomainAliasCommand.java similarity index 58% copy from server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainCommand.java copy to server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/RemoveDomainAliasCommand.java index ec38083..5e715d3 100644 --- a/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainCommand.java +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/cli/domain/RemoveDomainAliasCommand.java @@ -19,42 +19,43 @@ package org.apache.james.cli.domain; -import java.io.PrintStream; import java.util.concurrent.Callable; import org.apache.james.cli.WebAdminCli; import org.apache.james.httpclient.DomainClient; +import feign.Response; import picocli.CommandLine; @CommandLine.Command( - name = "domain", - description = "Manage Domains", - subcommands = { - DomainListCommand.class, - DomainCreateCommand.class, - DomainDeleteCommand.class, - DomainExistCommand.class - }) -public class DomainCommand implements Callable<Integer> { - - protected final WebAdminCli webAdminCli; - protected final PrintStream out; - protected final PrintStream err; - - public DomainCommand(PrintStream out, WebAdminCli webAdminCli, PrintStream err) { - this.out = out; - this.webAdminCli = webAdminCli; - this.err = err; - } + name = "removeAlias", + description = "Remove a domain alias") +public class RemoveDomainAliasCommand implements Callable<Integer> { + + public static final int CREATED_CODE = 204; + + @CommandLine.ParentCommand DomainCommand domainCommand; + + @CommandLine.Parameters(description = "Destination of the domain alias. This is the domain this alias belongs to.") + String destinationDomain; + + @CommandLine.Parameters(description = "Source of the domain alias.") + String sourceDomain; @Override public Integer call() { - return WebAdminCli.CLI_FINISHED_SUCCEED; - } - - public DomainClient fullyQualifiedURL(String partOfUrl) { - return webAdminCli.feignClientFactory(err).target(DomainClient.class, webAdminCli.jamesUrl + partOfUrl); + try { + DomainClient domainClient = domainCommand.fullyQualifiedURL("/domains"); + Response rs = domainClient.deleteADomainAlias(destinationDomain, sourceDomain); + if (rs.status() == CREATED_CODE) { + return WebAdminCli.CLI_FINISHED_SUCCEED; + } else { + return WebAdminCli.CLI_FINISHED_FAILED; + } + } catch (Exception e) { + e.printStackTrace(domainCommand.err); + return WebAdminCli.CLI_FINISHED_FAILED; + } } } \ No newline at end of file diff --git a/server/protocols/webadmin-cli/src/main/java/org/apache/james/httpclient/DomainClient.java b/server/protocols/webadmin-cli/src/main/java/org/apache/james/httpclient/DomainClient.java index d195b79..a67746d 100644 --- a/server/protocols/webadmin-cli/src/main/java/org/apache/james/httpclient/DomainClient.java +++ b/server/protocols/webadmin-cli/src/main/java/org/apache/james/httpclient/DomainClient.java @@ -20,12 +20,43 @@ package org.apache.james.httpclient; import java.util.List; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import feign.Param; import feign.RequestLine; import feign.Response; public interface DomainClient { + class DomainAliasResponse { + private final String source; + + @JsonCreator + public DomainAliasResponse(@JsonProperty("source") String source) { + this.source = source; + } + + public String getSource() { + return source; + } + + @Override + public final boolean equals(Object o) { + if (o instanceof DomainAliasResponse) { + DomainAliasResponse that = (DomainAliasResponse) o; + + return Objects.equals(this.source, that.source); + } + return false; + } + + @Override + public final int hashCode() { + return Objects.hash(source); + } + } @RequestLine("GET") List<String> getDomainList(); @@ -39,4 +70,12 @@ public interface DomainClient { @RequestLine("GET /{domainName}") Response doesExist(@Param("domainName") String domainName); + @RequestLine("DELETE /{destinationDomain}/aliases/{sourceDomain}") + Response deleteADomainAlias(@Param("destinationDomain") String destinationDomain, @Param("sourceDomain") String sourceDomain); + + @RequestLine("PUT /{destinationDomain}/aliases/{sourceDomain}") + Response addADomainAlias(@Param("destinationDomain") String destinationDomain, @Param("sourceDomain") String sourceDomain); + + @RequestLine("GET /{domainName}/aliases") + List<DomainAliasResponse> getDomainAliasList(@Param("domainName") String domainName); } diff --git a/server/protocols/webadmin-cli/src/test/java/org/apache/james/cli/DomainManageTest.java b/server/protocols/webadmin-cli/src/test/java/org/apache/james/cli/DomainManageTest.java index a219812..ea56084 100644 --- a/server/protocols/webadmin-cli/src/test/java/org/apache/james/cli/DomainManageTest.java +++ b/server/protocols/webadmin-cli/src/test/java/org/apache/james/cli/DomainManageTest.java @@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.io.ByteArrayOutputStream; import java.io.PrintStream; +import java.nio.charset.StandardCharsets; import org.apache.james.GuiceJamesServer; import org.apache.james.JamesServerBuilder; @@ -32,11 +33,16 @@ import org.apache.james.modules.TestJMAPServerModule; import org.apache.james.util.Port; import org.apache.james.utils.WebAdminGuiceProbe; import org.apache.james.webadmin.integration.WebadminIntegrationTestModule; +import org.assertj.core.api.SoftAssertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -public class DomainManageTest { +import com.google.common.collect.ImmutableList; +class DomainManageTest { @RegisterExtension static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider()) .server(configuration -> GuiceJamesServer.forConfiguration(configuration) @@ -48,113 +54,183 @@ public class DomainManageTest { private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); private final ByteArrayOutputStream errorStreamCaptor = new ByteArrayOutputStream(); - @Test - void domainListCommandShouldWShowOnlyDefaultDomain(GuiceJamesServer server) { - Port port = server.getProbe(WebAdminGuiceProbe.class).getWebAdminPort(); + Port port; - int exitCode = WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), - "--url", "http://127.0.0.1:" + port.getValue(), "domain", "list"); - assertThat(exitCode).isEqualTo(0); - assertThat(outputStreamCaptor.toString().trim().toCharArray()).containsOnly("localhost".toCharArray()); + @BeforeEach + void setUp(GuiceJamesServer server) { + port = server.getProbe(WebAdminGuiceProbe.class).getWebAdminPort(); + } + + @AfterEach + void tearDown() { + System.err.println(new String(errorStreamCaptor.toByteArray(), StandardCharsets.UTF_8)); } @Test - void domainCreateCommandWithValidNameShouldSuccessfully(GuiceJamesServer server) { - Port port = server.getProbe(WebAdminGuiceProbe.class).getWebAdminPort(); + void domainListCommandShouldWShowOnlyDefaultDomain() { + int exitCode = executeFluent("domain", "list"); - int exitCode = WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), - "--url", "http://127.0.0.1:" + port.getValue(), "domain", "create", "linagora.com"); + SoftAssertions.assertSoftly( softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString().trim().toCharArray()).containsOnly("localhost".toCharArray()); + }); + } - WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), - "--url", "http://127.0.0.1:" + port.getValue(), "domain", "list"); + @Test + void domainCreateCommandWithValidNameShouldSuccessfully() { + int exitCode = executeFluent("domain", "create", "linagora.com"); - assertThat(exitCode).isEqualTo(0); - assertThat(outputStreamCaptor.toString()).contains("linagora.com"); + executeFluent("domain", "list"); + + SoftAssertions.assertSoftly( softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString()).contains("linagora.com"); + }); } @Test - void domainCreateCommandWithInvalidNameShouldFailed(GuiceJamesServer server) { - Port port = server.getProbe(WebAdminGuiceProbe.class).getWebAdminPort(); - - int exitCode1 = WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), - "--url", "http://127.0.0.1:" + port.getValue(), "domain", "create", "@linagora.com"); + void domainCreateCommandWithInvalidNameShouldFailed() { + int exitCode1 = executeFluent("domain", "create", "@linagora.com"); - int exitCode2 = WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), - "--url", "http://127.0.0.1:" + port.getValue(), "domain", "create", "linagora.com/"); + int exitCode2 = executeFluent("domain", "create", "linagora.com/"); - int exitCode3 = WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), - "--url", "http://127.0.0.1:" + port.getValue(), "domain", "create", ""); + int exitCode3 = executeFluent("domain", "create", ""); WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), "--url", "http://127.0.0.1:" + port.getValue(), "domain", "list"); - assertThat(exitCode1).isEqualTo(1); - assertThat(exitCode2).isEqualTo(1); - assertThat(exitCode3).isEqualTo(1); - assertThat(outputStreamCaptor.toString().trim().toCharArray()).containsOnly("localhost".toCharArray()); + SoftAssertions.assertSoftly( softly -> { + assertThat(exitCode1).isEqualTo(1); + assertThat(exitCode2).isEqualTo(1); + assertThat(exitCode3).isEqualTo(1); + assertThat(outputStreamCaptor.toString().trim().toCharArray()).containsOnly("localhost".toCharArray()); + }); } @Test - void domainDeleteCommandWithValidDomainShouldSucceed(GuiceJamesServer server) { - Port port = server.getProbe(WebAdminGuiceProbe.class).getWebAdminPort(); - - WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), - "--url", "http://127.0.0.1:" + port.getValue(), "domain", "create", "linagora.com"); + void domainDeleteCommandWithValidDomainShouldSucceed() { + executeFluent("domain", "create", "linagora.com"); - int exitCode = WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), - "--url", "http://127.0.0.1:" + port.getValue(), "domain", "delete", "linagora.com"); + int exitCode = executeFluent("domain", "delete", "linagora.com"); - WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), - "--url", "http://127.0.0.1:" + port.getValue(), "domain", "list"); + executeFluent("domain", "list"); - assertThat(exitCode).isEqualTo(0); - assertThat(outputStreamCaptor.toString().contains("linagora.com")).isFalse(); + SoftAssertions.assertSoftly( softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString().contains("linagora.com")).isFalse(); + }); } @Test - void domainDeleteCommandWithDefaultDomainShouldFail(GuiceJamesServer server) { - Port port = server.getProbe(WebAdminGuiceProbe.class).getWebAdminPort(); - - int exitCode = WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), - "--url", "http://127.0.0.1:" + port.getValue(), "domain", "delete", "localhost"); + void domainDeleteCommandWithDefaultDomainShouldFail() { + int exitCode = executeFluent("domain", "delete", "localhost"); assertThat(exitCode).isEqualTo(1); } @Test - void domainExistCommandWithDefaultDomainShouldExist(GuiceJamesServer server) { - Port port = server.getProbe(WebAdminGuiceProbe.class).getWebAdminPort(); - - int exitCode = WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), - "--url", "http://127.0.0.1:" + port.getValue(), "domain", "exist", "localhost"); + void domainExistCommandWithDefaultDomainShouldExist() { + int exitCode = executeFluent("domain", "exist", "localhost"); - assertThat(exitCode).isEqualTo(0); - assertThat(outputStreamCaptor.toString().trim()).isEqualTo("localhost exists"); + SoftAssertions.assertSoftly( softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString().trim()).isEqualTo("localhost exists"); + }); } @Test - void domainExistCommandWithNonExistingDomainShouldFail(GuiceJamesServer server) { - Port port = server.getProbe(WebAdminGuiceProbe.class).getWebAdminPort(); - - int exitCode = WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), - "--url", "http://127.0.0.1:" + port.getValue(), "domain", "exist", "linagora.com"); + void domainExistCommandWithNonExistingDomainShouldFail() { + int exitCode = executeFluent("domain", "exist", "linagora.com"); assertThat(exitCode).isEqualTo(0); assertThat(outputStreamCaptor.toString().trim()).isEqualTo("linagora.com does not exist"); } @Test - void domainExistCommandWithAddedDomainShouldSucceed(GuiceJamesServer server) { - Port port = server.getProbe(WebAdminGuiceProbe.class).getWebAdminPort(); + void domainExistCommandWithAddedDomainShouldSucceed() { + executeFluent("domain", "create", "linagora.com"); - WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), - "--url", "http://127.0.0.1:" + port.getValue(), "domain", "create", "linagora.com"); + int exitCode = executeFluent("domain", "exist", "linagora.com"); - int exitCode = WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), - "--url", "http://127.0.0.1:" + port.getValue(), "domain", "exist", "linagora.com"); + SoftAssertions.assertSoftly( softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString().trim()).isEqualTo("linagora.com exists"); + }); + } - assertThat(exitCode).isEqualTo(0); - assertThat(outputStreamCaptor.toString().trim()).isEqualTo("linagora.com exists"); + @Nested + class DomainAliases { + @BeforeEach + void setUp() { + executeFluent("domain", "create", "linagora.com"); + executeFluent("domain", "create", "linagora-james.com"); + } + + @Test + void listDomainAliasShouldReturnEmptyByDefault() { + int exitCode = executeFluent("domain", "listAliases", "linagora.com"); + + SoftAssertions.assertSoftly( softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString().trim()).hasSize(0); + }); + } + + @Test + void addDomainAliasShouldBeIdempotent() { + executeFluent("domain", "addAlias", "linagora.com", "linagora-james.com"); + int exitCode = executeFluent("domain", "addAlias", "linagora.com", "linagora-james.com"); + + assertThat(exitCode).isEqualTo(0); + } + + @Test + void removeDomainAliasShouldBeIdempotent() { + int exitCode = executeFluent("domain", "removeAlias", "linagora.com", "linagora-james.com"); + + assertThat(exitCode).isEqualTo(0); + } + + @Test + void listDomainAliasShouldNotReturnRemovedValues() { + executeFluent("domain", "addAlias", "linagora.com", "linagora-james.com"); + executeFluent("domain", "removeAlias", "linagora.com", "linagora-james.com"); + + int exitCode = executeFluent("domain", "listAliases", "linagora.com"); + + SoftAssertions.assertSoftly( softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString().trim()).hasSize(0); + }); + } + + @Test + void listDomainAliasShouldReturnAddedValues() { + executeFluent("domain", "addAlias", "linagora.com", "linagora-james.com"); + + int exitCode = executeFluent("domain", "listAliases", "linagora.com"); + + SoftAssertions.assertSoftly( softly -> { + assertThat(exitCode).isEqualTo(0); + assertThat(outputStreamCaptor.toString().trim()).contains("linagora-james.com"); + }); + } + + @Test + void addAliasShouldRequireAManageDomain() { + int exitCode = executeFluent("domain", "addAlias", "linagora.com", "unknown.com"); + + SoftAssertions.assertSoftly( softly -> { + assertThat(exitCode).isEqualTo(1); + assertThat(errorStreamCaptor.toString().trim()).isEqualTo("{\"statusCode\":404,\"type\":\"InvalidArgument\",\"message\":\"The domain list does not contain: unknown.com\",\"details\":null}"); + }); + } } + private int executeFluent(String... args) { + return WebAdminCli.executeFluent(new PrintStream(outputStreamCaptor), new PrintStream(errorStreamCaptor), + ImmutableList.<String>builder().add("--url", "http://127.0.0.1:" + port.getValue()) + .addAll(ImmutableList.copyOf(args)) + .build()); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
