Skip to content

Commit

Permalink
Add a test case that proves issue #1318.
Browse files Browse the repository at this point in the history
  • Loading branch information
yuri-sergiichuk committed Dec 10, 2020
1 parent 5a56256 commit cb04db1
Show file tree
Hide file tree
Showing 3 changed files with 125 additions and 0 deletions.
32 changes: 32 additions & 0 deletions server/src/test/java/io/spine/server/model/HandlerMapTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,23 @@

package io.spine.server.model;

import io.spine.base.Identifier;
import io.spine.model.contexts.projects.ProjectId;
import io.spine.model.contexts.projects.command.SigCreateProject;
import io.spine.server.BoundedContextBuilder;
import io.spine.server.command.model.CommandHandlerSignature;
import io.spine.server.model.given.map.DupEventFilterValue;
import io.spine.server.model.given.map.DupEventFilterValueWhere;
import io.spine.server.model.given.map.DuplicateCommandHandlers;
import io.spine.server.model.given.map.RejectionsDispatchingTestEnv;
import io.spine.server.model.given.map.TwoFieldsInSubscription;
import io.spine.server.model.given.method.OneParamSignature;
import io.spine.server.model.given.method.StubHandler;
import io.spine.server.type.EventClass;
import io.spine.string.StringifierRegistry;
import io.spine.string.Stringifiers;
import io.spine.test.event.ProjectStarred;
import io.spine.testing.server.blackbox.ContextAwareTest;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
Expand Down Expand Up @@ -97,4 +103,30 @@ void failIfNotFound() {
assertThrows(IllegalStateException.class,
() -> map.handlerOf(EventClass.from(ProjectStarred.class)));
}

@Nested
@DisplayName("gracefully handle a missing handler for a rejection with a specific origin")
class SpecificRejection extends ContextAwareTest {

@Override
protected BoundedContextBuilder contextBuilder() {
return BoundedContextBuilder
.assumingTests()
.add(RejectionsDispatchingTestEnv.ProjectAgg.class)
.addEventDispatcher(new RejectionsDispatchingTestEnv.CompletionWatch());
}

@Test
void handleThrownRejectionGracefully() {
ProjectId project = ProjectId
.newBuilder()
.setId(Identifier.newUuid())
.vBuild();
SigCreateProject createProject = SigCreateProject
.newBuilder()
.setId(project)
.vBuild();
context().receivesCommand(createProject);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
/*
* Copyright 2020, TeamDev. All rights reserved.
*
* Redistribution and use in source and/or binary forms, with or without
* modification, must retain the above copyright notice and the following
* disclaimer.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package io.spine.server.model.given.map;

import io.spine.core.Subscribe;
import io.spine.model.contexts.projects.Project;
import io.spine.model.contexts.projects.ProjectId;
import io.spine.model.contexts.projects.command.SigCreateProject;
import io.spine.model.contexts.projects.command.SigStartProject;
import io.spine.model.contexts.projects.event.SigProjectCreated;
import io.spine.model.contexts.projects.event.SigProjectStarted;
import io.spine.model.contexts.projects.rejection.ProjectRejections;
import io.spine.model.contexts.projects.rejection.SigProjectAlreadyCompleted;
import io.spine.server.aggregate.Aggregate;
import io.spine.server.aggregate.Apply;
import io.spine.server.command.Assign;
import io.spine.server.event.AbstractEventSubscriber;

public final class RejectionsDispatchingTestEnv {

private RejectionsDispatchingTestEnv() {
}

/**
* A test aggregate that throws {@link SigProjectAlreadyCompleted} rejection for any
* handled command.
*/
public static final class ProjectAgg extends Aggregate<ProjectId, Project, Project.Builder> {

@Assign
SigProjectStarted handle(SigStartProject c) throws SigProjectAlreadyCompleted {
throw SigProjectAlreadyCompleted
.newBuilder()
.setProject(c.getId())
.build();
}

@Assign
SigProjectCreated handle(SigCreateProject c) throws SigProjectAlreadyCompleted {
throw SigProjectAlreadyCompleted
.newBuilder()
.setProject(c.getId())
.build();
}

@Apply
private void on(SigProjectStarted e) {
// do nothing.
}

@Apply
private void on(SigProjectCreated e) {
// do nothing.
}
}

/**
* A test environment for the rejection subscriptions tests.
*
* <p>The subscriber is interested in the rejection thrown upon trying to
* {@linkplain SigStartProject start} the project, but not in rejections thrown when the project
* is just being {@linkplain SigCreateProject created}.
*/
public static final class CompletionWatch extends AbstractEventSubscriber {

@Subscribe
void on(ProjectRejections.SigProjectAlreadyCompleted rejection, SigStartProject cmd) {
// do nothing.
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,7 @@ message SigOwnerAlreadyAssigned {
ProjectId project_id = 1;
core.UserId current_owner = 2;
}

message SigProjectAlreadyCompleted {
ProjectId project = 1;
}

0 comments on commit cb04db1

Please sign in to comment.