Repository: james-project Updated Branches: refs/heads/master dbc6f88cd -> 99b5cb6c7
JAMES-2366 Introduce Forward RRT mapping type Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/fd6f10ab Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/fd6f10ab Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/fd6f10ab Branch: refs/heads/master Commit: fd6f10ab67c1f6988f16ebaf1491a29abae091dd Parents: dbc6f88 Author: Antoine Duprat <adup...@linagora.com> Authored: Tue Mar 27 16:48:00 2018 +0200 Committer: Antoine Duprat <adup...@linagora.com> Committed: Fri Apr 6 14:38:36 2018 +0200 ---------------------------------------------------------------------- .../james/rrt/api/RecipientRewriteTable.java | 4 ++ .../java/org/apache/james/rrt/lib/Mapping.java | 7 ++- .../org/apache/james/rrt/lib/MappingTest.java | 24 +++++++++ .../rrt/file/XMLRecipientRewriteTableTest.java | 2 + .../rrt/lib/AbstractRecipientRewriteTable.java | 53 ++++++++++++++------ .../org/apache/james/rrt/lib/MappingImpl.java | 4 ++ .../user/lib/AbstractJamesUsersRepository.java | 9 ++++ .../lib/AbstractRecipientRewriteTableTest.java | 38 +++++++++++++- .../apache/james/rrt/lib/MappingImplTest.java | 47 +++++++++++------ .../james/rrt/lib/RewriteTablesStepdefs.java | 10 ++++ .../resources/cucumber/rewrite_tables.feature | 24 ++++++++- 11 files changed, 188 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/fd6f10ab/server/data/data-api/src/main/java/org/apache/james/rrt/api/RecipientRewriteTable.java ---------------------------------------------------------------------- diff --git a/server/data/data-api/src/main/java/org/apache/james/rrt/api/RecipientRewriteTable.java b/server/data/data-api/src/main/java/org/apache/james/rrt/api/RecipientRewriteTable.java index f07fd69..f1f11bd 100644 --- a/server/data/data-api/src/main/java/org/apache/james/rrt/api/RecipientRewriteTable.java +++ b/server/data/data-api/src/main/java/org/apache/james/rrt/api/RecipientRewriteTable.java @@ -207,6 +207,10 @@ public interface RecipientRewriteTable { */ void removeAliasDomainMapping(Domain aliasDomain, Domain realDomain) throws RecipientRewriteTableException; + void addForwardMapping(String user, Domain domain, String address) throws RecipientRewriteTableException; + + void removeForwardMapping(String user, Domain domain, String address) throws RecipientRewriteTableException; + class ErrorMappingException extends Exception { private static final long serialVersionUID = 2348752938798L; http://git-wip-us.apache.org/repos/asf/james-project/blob/fd6f10ab/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java ---------------------------------------------------------------------- diff --git a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java index 4bbf11f..72193dc 100644 --- a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java +++ b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java @@ -38,6 +38,9 @@ public interface Mapping { if (input.startsWith(Type.Error.asPrefix())) { return Type.Error; } + if (input.startsWith(Type.Forward.asPrefix())) { + return Type.Forward; + } return Type.Address; } @@ -47,6 +50,7 @@ public interface Mapping { Regex("regex:"), Domain("domain:"), Error("error:"), + Forward("forward:"), Address(""); private final String asPrefix; @@ -67,7 +71,8 @@ public interface Mapping { public static boolean hasPrefix(String mapping) { return mapping.startsWith(Regex.asPrefix()) || mapping.startsWith(Domain.asPrefix()) - || mapping.startsWith(Error.asPrefix()); + || mapping.startsWith(Error.asPrefix()) + || mapping.startsWith(Forward.asPrefix()); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/fd6f10ab/server/data/data-api/src/test/java/org/apache/james/rrt/lib/MappingTest.java ---------------------------------------------------------------------- diff --git a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/MappingTest.java b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/MappingTest.java index 5c4bca8..8297fca 100644 --- a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/MappingTest.java +++ b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/MappingTest.java @@ -45,6 +45,12 @@ public class MappingTest { } @Test + public void hasPrefixShouldReturnTrueWhenForward() { + boolean hasPrefix = Mapping.Type.hasPrefix(Type.Forward.asPrefix() + "myRegex"); + assertThat(hasPrefix).isTrue(); + } + + @Test public void hasPrefixShouldReturnFalseWhenAddress() { boolean hasPrefix = Mapping.Type.hasPrefix(Type.Address.asPrefix() + "myRegex"); assertThat(hasPrefix).isFalse(); @@ -75,6 +81,12 @@ public class MappingTest { } @Test + public void detectTypeShouldReturnForwardWhenForwardPrefix() { + assertThat(Mapping.detectType(Type.Forward.asPrefix() + "mapping")) + .isEqualTo(Type.Forward); + } + + @Test public void withoutPrefixShouldRemoveAddressPrefix() { assertThat(Type.Address.withoutPrefix(Type.Address.asPrefix() + "mapping")) .isEqualTo("mapping"); @@ -105,6 +117,12 @@ public class MappingTest { } @Test + public void withoutPrefixShouldRemoveForwardPrefix() { + assertThat(Type.Forward.withoutPrefix(Type.Forward.asPrefix() + "mapping")) + .isEqualTo("mapping"); + } + + @Test public void withoutPrefixShouldThrowOnBadPrefix() { assertThatThrownBy(() -> Type.Regex.withoutPrefix(Type.Domain.asPrefix() + "mapping")) .isInstanceOf(IllegalArgumentException.class); @@ -115,4 +133,10 @@ public class MappingTest { assertThatThrownBy(() -> Type.Regex.withoutPrefix("mapping")) .isInstanceOf(IllegalArgumentException.class); } + + @Test + public void withoutPrefixShouldThrowWhenNoPrefixOnForwardType() { + assertThatThrownBy(() -> Type.Forward.withoutPrefix("mapping")) + .isInstanceOf(IllegalArgumentException.class); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/fd6f10ab/server/data/data-file/src/test/java/org/apache/james/rrt/file/XMLRecipientRewriteTableTest.java ---------------------------------------------------------------------- diff --git a/server/data/data-file/src/test/java/org/apache/james/rrt/file/XMLRecipientRewriteTableTest.java b/server/data/data-file/src/test/java/org/apache/james/rrt/file/XMLRecipientRewriteTableTest.java index d4dd938..f5b7712 100644 --- a/server/data/data-file/src/test/java/org/apache/james/rrt/file/XMLRecipientRewriteTableTest.java +++ b/server/data/data-file/src/test/java/org/apache/james/rrt/file/XMLRecipientRewriteTableTest.java @@ -119,6 +119,8 @@ public class XMLRecipientRewriteTableTest extends AbstractRecipientRewriteTableT mappings = mappings.remove(MappingImpl.address(mapping)); } else if (type == Type.Domain) { mappings = mappings.remove(MappingImpl.domain(Domain.of(mapping))); + } else if (type == Type.Forward) { + mappings = mappings.remove(MappingImpl.forward(mapping)); } if (mappings.size() > 0) { http://git-wip-us.apache.org/repos/asf/james-project/blob/fd6f10ab/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java ---------------------------------------------------------------------- diff --git a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java index a079777..2b11cee 100644 --- a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java +++ b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java @@ -207,35 +207,37 @@ public abstract class AbstractRecipientRewriteTable implements RecipientRewriteT @Override public void addAddressMapping(String user, Domain domain, String address) throws RecipientRewriteTableException { + String addressWithDomain = addDefaultDomainIfNone(address); + checkAddressIsValid(addressWithDomain); + checkMapping(user, domain, MappingImpl.address(addressWithDomain)); + LOGGER.info("Add address mapping => {} for user: {} domain: {}", addressWithDomain, user, domain.name()); + addMappingInternal(user, domain, MappingImpl.address(addressWithDomain)); + } + + private String addDefaultDomainIfNone(String address) throws RecipientRewriteTableException { if (address.indexOf('@') < 0) { try { - address = address + "@" + domainList.getDefaultDomain().asString(); + return address + "@" + domainList.getDefaultDomain().asString(); } catch (DomainListException e) { throw new RecipientRewriteTableException("Unable to retrieve default domain", e); } } + return address; + } + + private void checkAddressIsValid(String addressWithDomain) throws RecipientRewriteTableException { try { - new MailAddress(address); + new MailAddress(addressWithDomain); } catch (ParseException e) { - throw new RecipientRewriteTableException("Invalid emailAddress: " + address, e); + throw new RecipientRewriteTableException("Invalid emailAddress: " + addressWithDomain, e); } - checkMapping(user, domain, MappingImpl.address(address)); - LOGGER.info("Add address mapping => {} for user: {} domain: {}", address, user, domain.name()); - addMappingInternal(user, domain, MappingImpl.address(address)); - } @Override public void removeAddressMapping(String user, Domain domain, String address) throws RecipientRewriteTableException { - if (address.indexOf('@') < 0) { - try { - address = address + "@" + domainList.getDefaultDomain().asString(); - } catch (DomainListException e) { - throw new RecipientRewriteTableException("Unable to retrieve default domain", e); - } - } - LOGGER.info("Remove address mapping => {} for user: {} domain: {}", address, user, domain.name()); - removeMappingInternal(user, domain, MappingImpl.address(address)); + String addressWithDomain = addDefaultDomainIfNone(address); + LOGGER.info("Remove address mapping => {} for user: {} domain: {}", addressWithDomain, user, domain.name()); + removeMappingInternal(user, domain, MappingImpl.address(addressWithDomain)); } @Override @@ -294,6 +296,9 @@ public abstract class AbstractRecipientRewriteTable implements RecipientRewriteT case Address: removeAddressMapping(user, domain, map); break; + case Forward: + removeForwardMapping(user, domain, map); + break; } } @@ -326,6 +331,22 @@ public abstract class AbstractRecipientRewriteTable implements RecipientRewriteT removeMappingInternal(null, aliasDomain, MappingImpl.domain(realDomain)); } + @Override + public void addForwardMapping(String user, Domain domain, String address) throws RecipientRewriteTableException { + String addressWithDomain = addDefaultDomainIfNone(address); + checkAddressIsValid(addressWithDomain); + checkMapping(user, domain, MappingImpl.forward(addressWithDomain)); + LOGGER.info("Add forward mapping => {} for user: {} domain: {}", addressWithDomain, user, domain.name()); + addMappingInternal(user, domain, MappingImpl.forward(addressWithDomain)); + } + + @Override + public void removeForwardMapping(String user, Domain domain, String address) throws RecipientRewriteTableException { + String addressWithDomain = addDefaultDomainIfNone(address); + LOGGER.info("Remove forward mapping => {} for user: {} domain: {}", addressWithDomain, user, domain.name()); + removeMappingInternal(user, domain, MappingImpl.forward(addressWithDomain)); + } + /** * Add new mapping * http://git-wip-us.apache.org/repos/asf/james-project/blob/fd6f10ab/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java ---------------------------------------------------------------------- diff --git a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java index fcd6572..1dc0c92 100644 --- a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java +++ b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java @@ -53,6 +53,10 @@ public class MappingImpl implements Mapping, Serializable { public static MappingImpl domain(Domain mapping) { return new MappingImpl(Type.Domain, mapping.asString()); } + + public static MappingImpl forward(String mapping) { + return new MappingImpl(Type.Forward, mapping); + } private final Type type; private final String mapping; http://git-wip-us.apache.org/repos/asf/james-project/blob/fd6f10ab/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java ---------------------------------------------------------------------- diff --git a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java index 3941868..8d3ce08 100644 --- a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java +++ b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java @@ -266,4 +266,13 @@ public abstract class AbstractJamesUsersRepository extends AbstractUsersReposito } + @Override + public void addForwardMapping(String user, Domain domain, String address) throws RecipientRewriteTableException { + throw new RecipientRewriteTableException("Read-Only RecipientRewriteTable"); + } + + @Override + public void removeForwardMapping(String user, Domain domain, String address) throws RecipientRewriteTableException { + throw new RecipientRewriteTableException("Read-Only RecipientRewriteTable"); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/fd6f10ab/server/data/data-library/src/test/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTableTest.java ---------------------------------------------------------------------- diff --git a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTableTest.java b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTableTest.java index 3dad6a0..26b3187 100644 --- a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTableTest.java +++ b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTableTest.java @@ -211,7 +211,6 @@ public abstract class AbstractRecipientRewriteTableTest { @Test public void testAliasDomainMapping() throws ErrorMappingException, RecipientRewriteTableException { - String domain = "realdomain"; Domain aliasDomain = Domain.of("aliasdomain"); String user = "user"; @@ -291,6 +290,36 @@ public abstract class AbstractRecipientRewriteTableTest { assertThat(virtualUserTable.getMappings(user, domain)).hasSize(2); } + @Test + public void addForwardMappingShouldStore() throws ErrorMappingException, RecipientRewriteTableException { + String user = "test"; + Domain domain = Domain.LOCALHOST; + String address = "test@localhost2"; + String address2 = "test@james"; + + addMapping(user, domain, address, Type.Forward); + addMapping(user, domain, address2, Type.Forward); + + assertThat(virtualUserTable.getMappings(user, domain)).hasSize(2); + } + + @Test + public void removeForwardMappingShouldDelete() throws ErrorMappingException, RecipientRewriteTableException { + String user = "test"; + Domain domain = Domain.LOCALHOST; + String address = "test@localhost2"; + String address2 = "test@james"; + + addMapping(user, domain, address, Type.Forward); + addMapping(user, domain, address2, Type.Forward); + + + removeMapping(user, domain, address, Type.Forward); + removeMapping(user, domain, address2, Type.Forward); + + assertThat(virtualUserTable.getMappings(user, domain)).isNull(); + } + protected abstract AbstractRecipientRewriteTable getRecipientRewriteTable() throws Exception; @@ -308,12 +337,14 @@ public abstract class AbstractRecipientRewriteTableTest { case Domain: virtualUserTable.addAliasDomainMapping(domain, Domain.of(mapping)); break; + case Forward: + virtualUserTable.addForwardMapping(user, domain, mapping); + break; default: throw new RuntimeException("Invalid mapping type: " + type.asPrefix()); } } - protected void removeMapping(String user, Domain domain, String mapping, Type type) throws RecipientRewriteTableException { switch (type) { case Error: @@ -328,6 +359,9 @@ public abstract class AbstractRecipientRewriteTableTest { case Domain: virtualUserTable.removeAliasDomainMapping(domain, Domain.of(mapping)); break; + case Forward: + virtualUserTable.removeForwardMapping(user, domain, mapping); + break; default: throw new RuntimeException("Invalid mapping type: " + type.asPrefix()); } http://git-wip-us.apache.org/repos/asf/james-project/blob/fd6f10ab/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingImplTest.java ---------------------------------------------------------------------- diff --git a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingImplTest.java b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingImplTest.java index 8810d83..e18823f 100644 --- a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingImplTest.java +++ b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingImplTest.java @@ -36,44 +36,53 @@ public class MappingImplTest { .verify(); } - @Test(expected = NullPointerException.class) + @Test public void addressFactoryMethodShouldThrowOnNull() { - assertThat(MappingImpl.address(null)); + assertThatThrownBy(() -> MappingImpl.address(null)) + .isInstanceOf(NullPointerException.class); } - @Test(expected = NullPointerException.class) + @Test public void regexFactoryMethodShouldThrowOnNull() { - assertThat(MappingImpl.regex(null)); + assertThatThrownBy(() -> MappingImpl.regex(null)) + .isInstanceOf(NullPointerException.class); } - @Test(expected = NullPointerException.class) + @Test public void domainFactoryMethodShouldThrowOnNull() { - assertThat(MappingImpl.domain(null)); + assertThatThrownBy(() -> MappingImpl.domain(null)) + .isInstanceOf(NullPointerException.class); } - - - @Test(expected = NullPointerException.class) + + @Test public void errorFactoryMethodShouldThrowOnNull() { - assertThat(MappingImpl.error(null)); + assertThatThrownBy(() -> MappingImpl.error(null)) + .isInstanceOf(NullPointerException.class); } @Test - public void hasDomainshouldReturnTrueWhenMappingContainAtMark() { + public void forwardFactoryMethodShouldThrowOnNull() { + assertThatThrownBy(() -> MappingImpl.forward(null)) + .isInstanceOf(NullPointerException.class); + } + + @Test + public void hasDomainShouldReturnTrueWhenMappingContainAtMark() { assertThat(MappingImpl.address("a@b").hasDomain()).isTrue(); } @Test - public void hasDomainshouldReturnFalseWhenMappingIsEmpty() { + public void hasDomainShouldReturnFalseWhenMappingIsEmpty() { assertThat(MappingImpl.address("").hasDomain()).isFalse(); } @Test - public void hasDomainshouldReturnFalseWhenMappingIsBlank() { + public void hasDomainShouldReturnFalseWhenMappingIsBlank() { assertThat(MappingImpl.address(" ").hasDomain()).isFalse(); } @Test - public void hasDefaultDomainShouldReturnFalseWhenMappingDoesntContainAtMark() { + public void hasDomainShouldReturnFalseWhenMappingDoesntContainAtMark() { assertThat(MappingImpl.address("abc").hasDomain()).isFalse(); } @@ -116,6 +125,11 @@ public class MappingImplTest { public void getTypeShouldReturnDomainWhenDomainPrefix() { assertThat(MappingImpl.domain(Domain.of("abc")).getType()).isEqualTo(Mapping.Type.Domain); } + + @Test + public void getTypeShouldReturnForwardWhenForwardPrefix() { + assertThat(MappingImpl.forward("abc").getType()).isEqualTo(Mapping.Type.Forward); + } @Test(expected = IllegalStateException.class) public void getErrorMessageShouldThrowWhenMappingIsNotAnError() { @@ -152,4 +166,9 @@ public class MappingImplTest { public void getAddressShouldThrowForDomain() { assertThatThrownBy(() -> MappingImpl.domain(Domain.of("value")).getAddress()).isInstanceOf(IllegalStateException.class); } + + @Test + public void getAddressShouldThrowForForward() { + assertThatThrownBy(() -> MappingImpl.forward("value").getAddress()).isInstanceOf(IllegalStateException.class); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/fd6f10ab/server/data/data-library/src/test/java/org/apache/james/rrt/lib/RewriteTablesStepdefs.java ---------------------------------------------------------------------- diff --git a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/RewriteTablesStepdefs.java b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/RewriteTablesStepdefs.java index 14655fe..44423d5 100644 --- a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/RewriteTablesStepdefs.java +++ b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/RewriteTablesStepdefs.java @@ -71,6 +71,11 @@ public class RewriteTablesStepdefs { rewriteTable.addAliasDomainMapping(Domain.of(aliasDomain), Domain.of(domain)); } + @Given("store \"([^\"]*)\" forward mapping for user \"([^\"]*)\" at domain \"([^\"]*)\"") + public void storeForwardMappingForUserAtDomain(String address, String user, String domain) throws Throwable { + rewriteTable.addForwardMapping(user, Domain.of(domain), address); + } + @Given("recursive mapping is disable") public void disableRecursiveMapping() { rewriteTable.setRecursiveMapping(false); @@ -96,6 +101,11 @@ public class RewriteTablesStepdefs { rewriteTable.removeErrorMapping(user, Domain.of(domain), error); } + @When("user \"([^\"]*)\" at domain \"([^\"]*)\" removes a forward mapping \"([^\"]*)\"") + public void userAtDomainRemovesForwardMapping(String user, String domain, String address) throws Throwable { + rewriteTable.removeForwardMapping(user, Domain.of(domain), address); + } + @When("wildcard address mapping \"([^\"]*)\" at domain \"([^\"]*)\" is removed") public void removeWildcardAddressMappingAtDomain(String address, String domain) throws Throwable { userAtDomainRemovesAddressMapping(RecipientRewriteTable.WILDCARD, domain, address); http://git-wip-us.apache.org/repos/asf/james-project/blob/fd6f10ab/server/data/data-library/src/test/resources/cucumber/rewrite_tables.feature ---------------------------------------------------------------------- diff --git a/server/data/data-library/src/test/resources/cucumber/rewrite_tables.feature b/server/data/data-library/src/test/resources/cucumber/rewrite_tables.feature index 5ce3ec8..9e66fc0 100644 --- a/server/data/data-library/src/test/resources/cucumber/rewrite_tables.feature +++ b/server/data/data-library/src/test/resources/cucumber/rewrite_tables.feature @@ -218,4 +218,26 @@ Feature: Rewrite Tables tests Given store "domain2" alias domain mapping for domain "domain1" And store "domain3" alias domain mapping for domain "domain2" And store "domain4" alias domain mapping for domain "domain3" - Then mappings for user "test" at domain "domain4" should contains only "test@domain1" \ No newline at end of file + Then mappings for user "test" at domain "domain4" should contains only "test@domain1" + +# Forward mapping + + Scenario: stored forward mapping should be retrieved when one mapping is matching + Given store "test@localhost2" forward mapping for user "test" at domain "localhost" + Then mappings for user "test" at domain "localhost" should contains only "forward:test@localhost2" + + Scenario: stored forward mapping should be retrieved when two mappings are matching + Given store "test@localhost2" forward mapping for user "test" at domain "localhost" + And store "test@james" forward mapping for user "test" at domain "localhost" + Then mappings for user "test" at domain "localhost" should contains only "forward:test@localhost2, forward:test@james" + + Scenario: stored forward mapping should not be retrieved by another user + Given store "test@localhost2" forward mapping for user "test" at domain "localhost" + And store "test@james" forward mapping for user "test" at domain "localhost" + Then mappings for user "test2" at domain "localhost" should be empty + + Scenario: removing a stored forward mapping should work + Given store "test@localhost2" forward mapping for user "test" at domain "localhost" + And store "test@james" forward mapping for user "test" at domain "localhost" + When user "test" at domain "localhost" removes a forward mapping "test@james" + Then mappings for user "test" at domain "localhost" should contains only "forward:test@localhost2" \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org