Package com.saasovation.collaboration.domain.model.forum

Source Code of com.saasovation.collaboration.domain.model.forum.ForumTest

//   Copyright 2012,2013 Vaughn Vernon
//
//   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
//
//       http://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 com.saasovation.collaboration.domain.model.forum;

import com.saasovation.collaboration.domain.model.DomainRegistry;
import com.saasovation.collaboration.domain.model.collaborator.Author;
import com.saasovation.collaboration.domain.model.collaborator.Moderator;
import com.saasovation.collaboration.domain.model.tenant.Tenant;
import com.saasovation.common.domain.model.DomainEventPublisher;
import com.saasovation.common.domain.model.DomainEventSubscriber;

public class ForumTest extends AbstractForumTest {

    protected Discussion discussion;
    protected DiscussionId discussionId;
    protected Forum forum;
    protected ForumId forumId;
    protected Post post;
    protected Post postAgain;
    protected PostId postId;
    protected String subject;
    protected Tenant tenant;

    public ForumTest() {
        super();
    }

    public void testCreateForum() throws Exception {

        forum = this.forumAggregate();

        assertNotNull(forum.tenant());
        assertNotNull(forum.tenant().id());
        assertEquals(8, forum.tenant().id().length());
        assertEquals("jdoe", forum.creator().identity());
        assertEquals("jdoe@saasovation.com", forum.moderator().emailAddress());
        assertTrue(forum.isModeratedBy(forum.moderator()));
        assertEquals("John Doe Does DDD", forum.subject());
        assertEquals("A set of discussions about DDD for anonymous developers.", forum.description());

        DomainRegistry.forumRepository().save(forum);

        expectedEvents(1);
        expectedEvent(ForumStarted.class);

        expectedNotifications(1);
        expectedNotification(ForumStarted.class);
    }

    public void testAssignModerator() throws Exception {

        forum = this.forumAggregate();

        forum.assignModerator(new Moderator("zdoe", "Zoe Doe", "zdoe@saasovation.com"));

        assertEquals("zdoe", forum.moderator().identity());
        assertEquals("zdoe@saasovation.com", forum.moderator().emailAddress());

        DomainRegistry.forumRepository().save(forum);

        expectedEvents(2);
        expectedEvent(ForumStarted.class);
        expectedEvent(ForumModeratorChanged.class);

        expectedNotifications(2);
        expectedNotification(ForumStarted.class);
        expectedNotification(ForumModeratorChanged.class);
    }

    public void testChangeDescription() throws Exception {

        forum = this.forumAggregate();

        forum.changeDescription("And Zoe knows...");

        assertEquals("And Zoe knows...", forum.description());

        DomainRegistry.forumRepository().save(forum);

        expectedEvents(2);
        expectedEvent(ForumStarted.class);
        expectedEvent(ForumDescriptionChanged.class);

        expectedNotifications(2);
        expectedNotification(ForumStarted.class);
        expectedNotification(ForumDescriptionChanged.class);
    }

    public void testChangeSubject() throws Exception {

        forum = this.forumAggregate();

        forum.changeSubject("Zoe Likes DDD");

        assertEquals("Zoe Likes DDD", forum.subject());

        DomainRegistry.forumRepository().save(forum);

        expectedEvents(2);
        expectedEvent(ForumStarted.class);
        expectedEvent(ForumSubjectChanged.class);

        expectedNotifications(2);
        expectedNotification(ForumStarted.class);
        expectedNotification(ForumSubjectChanged.class);
    }

    public void testClose() throws Exception {

        forum = this.forumAggregate();

        forum.close();

        assertTrue(forum.isClosed());

        boolean failed = false;

        try {
            forum.changeDescription("Blah...");

            fail("Should have thrown exception.");

        } catch (Exception e) {
            failed = true;
        }

        assertTrue(failed);

        DomainRegistry.forumRepository().save(forum);

        expectedEvents(2);
        expectedEvent(ForumStarted.class);
        expectedEvent(ForumClosed.class);

        expectedNotifications(2);
        expectedNotification(ForumStarted.class);
        expectedNotification(ForumClosed.class);
    }

    public void testReopen() throws Exception {

        forum = this.forumAggregate();

        forum.close();

        assertTrue(forum.isClosed());

        forum.reopen();

        assertFalse(forum.isClosed());

        try {
            forum.changeDescription("Blah...");

        } catch (Exception e) {
            fail("Should have succeeded.");
        }

        assertEquals("Blah...", forum.description());

        DomainRegistry.forumRepository().save(forum);

        expectedEvents(4);
        expectedEvent(ForumStarted.class);
        expectedEvent(ForumClosed.class);
        expectedEvent(ForumReopened.class);
        expectedEvent(ForumDescriptionChanged.class);

        expectedNotifications(4);
        expectedNotification(ForumStarted.class);
        expectedNotification(ForumClosed.class);
        expectedNotification(ForumReopened.class);
        expectedNotification(ForumDescriptionChanged.class);
    }

    public void testStartDiscussion() throws Exception {

        forum = this.forumAggregate();

        DomainRegistry.forumRepository().save(forum);

        DomainEventPublisher
            .instance()
            .subscribe(new DomainEventSubscriber<DiscussionStarted>() {
                public void handleEvent(DiscussionStarted aDomainEvent) {
                    tenant = aDomainEvent.tenant();
                    forumId = aDomainEvent.forumId();
                    discussionId = aDomainEvent.discussionId();
                    subject = aDomainEvent.subject();
                }
                public Class<DiscussionStarted> subscribedToEventType() {
                    return DiscussionStarted.class;
                }
            });

        discussion = forum.startDiscussion(
                DomainRegistry.forumIdentityService(),
                new Author("jdoe", "John Doe", "jdoe@saasovation.com"),
                "All About DDD");

        DomainRegistry.discussionRepository().save(discussion);

        assertNotNull(tenant);
        assertEquals(tenant, forum.tenant());
        assertNotNull(forumId);
        assertEquals(forumId, forum.forumId());
        assertNotNull(discussionId);
        assertNotNull(discussion);
        assertEquals(discussionId, discussion.discussionId());
        assertEquals("jdoe", discussion.author().identity());
        assertNotNull(subject);

        expectedEvents(2);
        expectedEvent(ForumStarted.class);
        expectedEvent(DiscussionStarted.class);

        expectedNotifications(2);
        expectedNotification(ForumStarted.class);
        expectedNotification(DiscussionStarted.class);
    }

    public void testModeratedPostContent() throws Exception {

        forum = this.forumAggregate();

        DomainRegistry.forumRepository().save(forum);

        DomainEventPublisher
            .instance()
            .subscribe(new DomainEventSubscriber<DiscussionStarted>() {
                public void handleEvent(DiscussionStarted aDomainEvent) {
                    discussionId = aDomainEvent.discussionId();
                }
                public Class<DiscussionStarted> subscribedToEventType() {
                    return DiscussionStarted.class;
                }
            });

        discussion = forum.startDiscussion(
                DomainRegistry.forumIdentityService(),
                new Author("jdoe", "John Doe", "jdoe@saasovation.com"),
                "All About DDD");

        DomainRegistry.discussionRepository().save(discussion);

        post = discussion.post(
                DomainRegistry.forumIdentityService(),
                new Author("jdoe", "John Doe", "jdoe@saasovation.com"),
                "Subject",
                "Body text.");

        DomainRegistry.postRepository().save(post);

        post = DomainRegistry.postRepository().postOfId(post.tenant(), post.postId());

        forum.moderatePost(
                post,
                forum.moderator(),
                "MODERATED: Subject",
                "MODERATED: Body text.");

        DomainRegistry.postRepository().save(post);

        assertTrue(post.subject().startsWith("MODERATED: "));
        assertTrue(post.bodyText().startsWith("MODERATED: "));

        expectedEvents(4);
        expectedEvent(ForumStarted.class);
        expectedEvent(DiscussionStarted.class);
        expectedEvent(PostedToDiscussion.class);
        expectedEvent(PostContentAltered.class);

        expectedNotifications(4);
        expectedNotification(ForumStarted.class);
        expectedNotification(DiscussionStarted.class);
        expectedNotification(PostedToDiscussion.class);
        expectedNotification(PostContentAltered.class);
    }
}
TOP

Related Classes of com.saasovation.collaboration.domain.model.forum.ForumTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.