org.jtalks.jcommune.service.nontransactional.MentionedUsersTest.java Source code

Java tutorial

Introduction

Here is the source code for org.jtalks.jcommune.service.nontransactional.MentionedUsersTest.java

Source

/**
 * Copyright (C) 2011  JTalks.org Team
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */
package org.jtalks.jcommune.service.nontransactional;

import org.apache.commons.collections.CollectionUtils;
import org.jtalks.jcommune.model.dao.PostDao;
import org.jtalks.jcommune.model.dao.UserDao;
import org.jtalks.jcommune.model.entity.JCUser;
import org.jtalks.jcommune.model.entity.Post;
import org.jtalks.jcommune.model.entity.Topic;
import org.jtalks.jcommune.plugin.api.exceptions.NotFoundException;
import org.mockito.Mock;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletWebRequest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import java.util.*;

import static java.lang.String.format;
import static java.util.Arrays.asList;
import static org.mockito.Mockito.*;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.testng.Assert.*;

/** @author Anuar_Nurmakanov */
public class MentionedUsersTest {
    private static final String MENTIONING_TEMPLATE = "This post contains not notified [user]%s[/user] mentioning "
            + "and notified [user notified=true]%s[/user] mentioning";
    private static final String MENTIONING_WITH_LINK_TO_PROFILE_TEMPALTE = "This post contains not notified [user=%s]%s[/user] mentioning and notified [user=%s]%s[/user] mentioning";

    @Mock
    private MailService mailService;
    @Mock
    private UserDao userDao;
    @Mock
    private PostDao postDao;

    @BeforeMethod
    public void init() {
        initMocks(this);
    }

    @Test
    public void extractMentionedUserShouldNotRecognizeUsersIfTextWithoutBbCodes() {
        String textWithoutUserMentioning = "This text mustn't contain user mentioning. Be careful.";

        MentionedUsers mentionedUsers = MentionedUsers.parse(textWithoutUserMentioning);
        Set<String> extractedUserNames = mentionedUsers.extractAllMentionedUsers(textWithoutUserMentioning);

        assertTrue(CollectionUtils.isEmpty(extractedUserNames),
                "Passed user should not contain any user mentioning.");
    }

    @Test
    public void extractMentionedUserShouldRecognizeMultipleUsersInBbCodes() {
        String textWithUsersMentioning = "In this text we have 3 user mentioning: first [user]Shogun[/user],"
                + "second [user notified=true]masyan[/user]," + "third [user]jk1[/user]";

        MentionedUsers mentionedUsers = MentionedUsers.parse(textWithUsersMentioning);
        Set<String> extractedUserNames = mentionedUsers.extractAllMentionedUsers(textWithUsersMentioning);

        assertTrue(extractedUserNames.containsAll(asList("Shogun", "masyan", "jk1")));
    }

    @Test
    public void extractMentionedUserShouldReturnAllMentionedCyrillicUserInBBCodes() {
        String textWithUsersMentioning = "In this text we have 1 user mentioning: first [user][/user]";

        MentionedUsers mentionedUsers = MentionedUsers.parse(textWithUsersMentioning);
        Set<String> extractedUserNames = mentionedUsers.extractAllMentionedUsers(textWithUsersMentioning);

        assertEquals(extractedUserNames.iterator().next(), "",
                "MentionedUsers should extract cyrillic usernames from [user] bb code");
    }

    @Test
    public void extractMentionedUserShouldReturnAllMentionedSpecialCharactersUserInBBCodes() {
        String textWithUsersMentioning = "In this text we have 3 user mentioning: first [user]<yak[/user],"
                + "second [user notified=true]\\yak[/user]," + "third [user]]yak[/user]";

        MentionedUsers mentionedUsers = MentionedUsers.parse(textWithUsersMentioning);
        Set<String> extractedUserNames = mentionedUsers.extractAllMentionedUsers(textWithUsersMentioning);

        assertTrue(extractedUserNames.size() == 3, "Passed text should contain 3 user mentioning.");
        assertTrue(extractedUserNames.contains("<yak"), "< in username prevented username from being recognized.");
        assertTrue(extractedUserNames.contains("\\yak"),
                "\\ in username prevented username from being recognized.");
        assertTrue(extractedUserNames.contains("]yak"), "] in username prevented username from being recognized.");
    }

    @Test
    public void extractMentionedUserShouldReturnAllMentionedUserWithSpacesInBBCodes() {
        String textWithUsersMentioning = "In this text we have 1 user mentioning: first [user]     [/user]";

        MentionedUsers mentionedUsers = MentionedUsers.parse(textWithUsersMentioning);
        Set<String> extractedUserNames = mentionedUsers.extractAllMentionedUsers(textWithUsersMentioning);

        assertTrue(extractedUserNames.contains("     "),
                "MentionedUsers should extract usernames with spaces");
    }

    @Test
    public void extractMentionedUserShouldReturnMentionedUserWithSquareBracketsInBBCodes() {
        String textWithUsersMentioning = "first [user]userWithoutBrackets[/user]"
                + "second [user][userWithBrackets][/user]";

        MentionedUsers mentionedUsers = MentionedUsers.parse(textWithUsersMentioning);
        Set<String> extractedUserNames = mentionedUsers.extractAllMentionedUsers(textWithUsersMentioning);

        assertTrue(extractedUserNames.contains("userWithoutBrackets"),
                "MentionedUsers should extract username without brackets");
        assertTrue(extractedUserNames.contains("[userWithBrackets]"),
                "MentionedUsers should extract username with brackets");
    }

    @Test
    public void extractMentionedUserShouldReturnMentionedUserWithSquareBracketsInBBCodesU() {
        String textWithUsersMentioning = "second [user][user][userWithBrackets][/user][/user]";

        MentionedUsers mentionedUsers = MentionedUsers.parse(textWithUsersMentioning);
        Set<String> extractedUserNames = mentionedUsers.extractAllMentionedUsers(textWithUsersMentioning);

        assertTrue(extractedUserNames.contains("[user][userWithBrackets][/user]"),
                "MentionedUsers should extract username with brackets");
    }

    /**
     * When data is sent to the server for the preview, there is a hack that coverts some special symbols into
     * unrecognizable character sequence. This replacement was implemented as a temporal solution, but still is there,
     * until it's present, we have to decode those symbols in order to find a user there.
     */
    @Test
    public void extractMentionedUserShouldReturnAllMentionedEncodedUserInBBCodes() {
        String textWithUsersMentioning = "In this text we have 4 user mentioning: "
                + "first [user]@ywdffgg434y@yak[/user],"
                + "second [user notified=true]gertfgertgf@@@@@#4324234yak[/user],"
                + "third [user]14@123435vggv4fyak[/user]" + "forth [user]@w0956756wo@yak[/user]";

        MentionedUsers mentionedUsers = MentionedUsers.parse(textWithUsersMentioning);
        Set<String> extractedUserNames = mentionedUsers.extractAllMentionedUsers(textWithUsersMentioning);

        assertTrue(extractedUserNames.size() == 4, "Passed text should contain 4 user mentioning.");
        assertTrue(extractedUserNames.contains("[yak"), "[yak is mentioned, so he should be extracted.");
        assertTrue(extractedUserNames.contains("<yak"), "<yak is mentioned, so he should be extracted.");
        assertTrue(extractedUserNames.contains("\\yak"), "\\yak is mentioned, so he should be extracted.");
        assertTrue(extractedUserNames.contains("]yak"), "]yak is mentioned, so he should be extracted.");
    }

    @Test
    public void extractMentionedUserShouldRecognizedEncodedInUriNames() {
        String textWithUsersMentioning = "In this text we have 2 user mentioning: "
                + "first [user]%D0%B8%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2[/user]" + "second [user]%5Cyak[/user]";

        MentionedUsers mentionedUsers = MentionedUsers.parse(textWithUsersMentioning);
        Set<String> extractedUserNames = mentionedUsers.extractAllMentionedUsers(textWithUsersMentioning);

        assertFalse(extractedUserNames.contains(""), "We don't have to decode this values.");
        assertFalse(extractedUserNames.contains("\\yak"), "We don't have to decode this value.");
    }

    @Test
    public void notifyNewlyShouldSendEmailForNewlyMentionedUsers() {
        Post mentioningPost = getPost(1L, "In this text we have 3 user mentioning: first [user]Shogun[/user]");
        when(userDao.getByUsernames(asSet("Shogun"))).thenReturn(asList(getJCUser("Shogun", true)));

        MentionedUsers mentionedUsers = MentionedUsers.parse(mentioningPost);
        List<JCUser> notifiedUsers = mentionedUsers.getNewUsersToNotify(userDao);
        assertEquals(notifiedUsers.get(0).getUsername(), "Shogun");
    }

    /**
     * When a user was notified about him being mentioned in a post, the post should change [user] bb code to
     * [user notified=true] in order not to notify him again.
     */
    @Test
    public void notifyNewlyMentionedUsersShouldMarkBbAsNotified() {
        Post mentioningPost = getPost(1L, "text [user]Shogun[/user]text");
        when(userDao.getByUsernames(asSet("Shogun"))).thenReturn(asList(getJCUser("Shogun", true)));

        MentionedUsers.parse(mentioningPost).markUsersAsAlreadyNotified(postDao);

        assertEquals(mentioningPost.getPostContent(), "text [user notified=true]Shogun[/user]text",
                "After sending email [user][/user] tag should be changed to [user notified=true][/user]");
        verify(postDao).saveOrUpdate(mentioningPost);
    }

    @Test
    public void notifyNewlyMentionedUsersShouldNotNotifyNotAgreedWithNotificationsUsers() {
        Post mentioningPost = getPost(1L, "[user]Shogun[/user]");
        JCUser mentionedUser = getJCUser("Shogun", false);
        when(userDao.getByUsernames(asSet("Shogun"))).thenReturn(asList(mentionedUser));

        List<JCUser> usersToNotify = MentionedUsers.parse(mentioningPost).getNewUsersToNotify(userDao);

        assertEquals(mentioningPost.getPostContent(), "[user]Shogun[/user]",
                "After sending email [user][/user] tag shouldn't be changed");
        assertTrue(usersToNotify.isEmpty());
        verify(postDao, never()).saveOrUpdate(mentioningPost);
    }

    @Test
    public void notifyNewlyMentionedUsersShouldNotSendWhenUsersWereNotFound() {
        Post mentioningPost = getPost(1L, "[user]Shogun[/user]");
        when(userDao.getByUsernames(asSet("Shogun"))).thenReturn(Collections.<JCUser>emptyList());

        List<JCUser> usersToNotify = MentionedUsers.parse(mentioningPost).getNewUsersToNotify(userDao);

        assertEquals(mentioningPost.getPostContent(), "[user]Shogun[/user]",
                "[user] code shouldn't be if user not found");
        assertEquals(usersToNotify.size(), 0);
        verify(postDao, never()).saveOrUpdate(mentioningPost);
    }

    @Test
    public void notifyNewlyMentionedUsersShouldNotSendIfUserIsSubscriberOfTopic() {
        JCUser mentionedUser = getJCUser("Shogun", true);
        Post mentioningPost = getPost(1L, "[user]Shogun[/user]");
        mentioningPost.getTopic().setSubscribers(asSet(mentionedUser));
        when(userDao.getByUsernames(asSet("Shogun"))).thenReturn(asList(mentionedUser));

        List<JCUser> usersToNotify = MentionedUsers.parse(mentioningPost).getNewUsersToNotify(userDao);

        assertEquals(mentioningPost.getPostContent(), "[user]Shogun[/user]",
                "[user][/user] code should not be changed if user was subscribed.");
        assertEquals(usersToNotify.size(), 0);
        verify(postDao, never()).saveOrUpdate(mentioningPost);
    }

    private JCUser getJCUser(String name, boolean isMentioningEnabled) {
        JCUser user = new JCUser(name, "email@gmail.com", "password");
        user.setMentioningNotificationsEnabled(isMentioningEnabled);
        return user;
    }

    @Test(expectedExceptions = IllegalStateException.class)
    public void mentionedUserNotifyNewlyMentionedShouldThrowExceptionWhenNotCreatedBasedOnPost() {
        MentionedUsers mentionedUsers = MentionedUsers.parse("");
        mentionedUsers.getNewUsersToNotify(userDao);
    }

    @Test(expectedExceptions = IllegalStateException.class)
    public void mentionedUserMarkAsNotifiedShouldThrowExceptionWhenNotCreatedBasedOnPost() {
        MentionedUsers mentionedUsers = MentionedUsers.parse("");
        mentionedUsers.markUsersAsAlreadyNotified(postDao);
    }

    private Post getPost(long id, String content) {
        Post post = new Post(null, content);
        post.setTopic(new Topic());
        post.setId(id);
        return post;
    }

    private void setupRequestAttributes() {
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.setScheme("http");
        request.setServerName("localhost");
        request.setServerPort(8080);
        request.setContextPath("/forum");
        RequestContextHolder.setRequestAttributes(new ServletWebRequest(request));
    }

    public static <T> Set<T> asSet(T... values) {
        return new HashSet<>(Arrays.asList(values));
    }

    private JCUser getUser(String username, long userId) {
        JCUser user = new JCUser(username, "sshogunn@gmail.com", "shogun password");
        user.setId(userId);
        return user;
    }

    @Test
    public void processShouldAttachProfileLinkToExistCyrillicUsers() throws NotFoundException {
        setupRequestAttributes();

        String cyrillicCharsUserName = "";
        String cyrillicCharsUserNameWithSpaces = "     ";

        JCUser cyrillicCharsUser = getUser(cyrillicCharsUserName, 100L);
        when(userDao.getByUsername(cyrillicCharsUserName)).thenReturn(cyrillicCharsUser);
        JCUser notifiedMentionedUser = getUser(cyrillicCharsUserNameWithSpaces, 101L);
        when(userDao.getByUsername(cyrillicCharsUserNameWithSpaces)).thenReturn(notifiedMentionedUser);
        //
        String cyrillicCharsUserProfile = "/forum/users/" + cyrillicCharsUser.getId();
        String cyrillicCharsUserWithSpaceProfile = "/forum/users/" + notifiedMentionedUser.getId();
        String notProcessedSource = format(MENTIONING_TEMPLATE, cyrillicCharsUserName,
                cyrillicCharsUserNameWithSpaces);

        MentionedUsers mentionedUsers = MentionedUsers.parse(notProcessedSource);

        String expectedAfterProcess = format(MENTIONING_WITH_LINK_TO_PROFILE_TEMPALTE, cyrillicCharsUserProfile,
                cyrillicCharsUserName, cyrillicCharsUserWithSpaceProfile, cyrillicCharsUserNameWithSpaces);

        String actualAfterProcess = mentionedUsers.getTextWithProcessedUserTags(userDao);

        assertEquals(actualAfterProcess, expectedAfterProcess);
    }

    @Test
    public void processShouldAttachProfileLinkToExistUsersWithBracketsInName() throws NotFoundException {
        setupRequestAttributes();

        String userNameWithOpenBracket = "]yak";
        String userNameWithCloseBracket = "yak";

        JCUser userWithOpenBracketInName = getUser(userNameWithOpenBracket, 100L);
        when(userDao.getByUsername(userNameWithOpenBracket)).thenReturn(userWithOpenBracketInName);
        JCUser userWithCloseBracketInName = getUser(userNameWithCloseBracket, 101L);
        when(userDao.getByUsername(userNameWithCloseBracket)).thenReturn(userWithCloseBracketInName);
        //
        String withOpenBracketUserProfile = "/forum/users/" + userWithOpenBracketInName.getId();
        String withCloseBracketUserProfile = "/forum/users/" + userWithCloseBracketInName.getId();
        String notProcessedSource = format(MENTIONING_TEMPLATE, userNameWithOpenBracket, userNameWithCloseBracket);

        MentionedUsers mentionedUsers = MentionedUsers.parse(notProcessedSource);

        String expectedAfterProcess = format(MENTIONING_WITH_LINK_TO_PROFILE_TEMPALTE, withOpenBracketUserProfile,
                userNameWithOpenBracket, withCloseBracketUserProfile, userNameWithCloseBracket);

        String actualAfterProcess = mentionedUsers.getTextWithProcessedUserTags(userDao);

        assertEquals(actualAfterProcess, expectedAfterProcess);
    }

    @Test
    public void processShouldAttachProfileLinkToExistUsersWithSlashesInName() throws NotFoundException {
        setupRequestAttributes();

        String userNameWithSlash = "/yak";
        String userNameWithBackSlash = "\\yak";

        JCUser userWithSlashInName = getUser(userNameWithSlash, 100L);
        when(userDao.getByUsername(userNameWithSlash)).thenReturn(userWithSlashInName);
        JCUser userWithBackSlashInName = getUser(userNameWithBackSlash, 101L);
        when(userDao.getByUsername(userNameWithBackSlash)).thenReturn(userWithBackSlashInName);
        //
        String withSlashUserProfile = "/forum/users/" + userWithSlashInName.getId();
        String withBackSlashUserProfile = "/forum/users/" + userWithBackSlashInName.getId();
        String notProcessedSource = format(MENTIONING_TEMPLATE, userNameWithSlash, userNameWithBackSlash);

        MentionedUsers mentionedUsers = MentionedUsers.parse(notProcessedSource);

        String expectedAfterProcess = format(MENTIONING_WITH_LINK_TO_PROFILE_TEMPALTE, withSlashUserProfile,
                userNameWithSlash, withBackSlashUserProfile, userNameWithBackSlash);

        String actualAfterProcess = mentionedUsers.getTextWithProcessedUserTags(userDao);

        assertEquals(actualAfterProcess, expectedAfterProcess);
    }

    @Test
    public void processShouldAttachProfileLinkToExistUsersWithLowerGreaterInName() throws NotFoundException {
        setupRequestAttributes();

        String userNameWithLower = "<yak";
        String userNameWithGreater = ">yak";

        JCUser userWithLowerInName = getUser(userNameWithLower, 100L);
        when(userDao.getByUsername(userNameWithLower)).thenReturn(userWithLowerInName);
        JCUser userWithGreaterInName = getUser(userNameWithGreater, 101L);
        when(userDao.getByUsername(userNameWithGreater)).thenReturn(userWithGreaterInName);
        //
        String withLowerUserProfile = "/forum/users/" + userWithLowerInName.getId();
        String withGreaterUserProfile = "/forum/users/" + userWithGreaterInName.getId();
        String notProcessedSource = format(MENTIONING_TEMPLATE, userNameWithLower, userNameWithGreater);

        MentionedUsers mentionedUsers = MentionedUsers.parse(notProcessedSource);

        String expectedAfterProcess = format(MENTIONING_WITH_LINK_TO_PROFILE_TEMPALTE, withLowerUserProfile,
                userNameWithLower, withGreaterUserProfile, userNameWithGreater);

        String actualAfterProcess = mentionedUsers.getTextWithProcessedUserTags(userDao);

        assertEquals(actualAfterProcess, expectedAfterProcess);
    }

    @Test
    public void processShouldAttachProfileLinkToExistUsersWithSpecialCharsInName() throws NotFoundException {
        setupRequestAttributes();

        String userNameWithPercents = "%yak";
        String userNameWithPipeSymbol = "|yak";

        JCUser userWithPercentsInName = getUser(userNameWithPercents, 100L);
        when(userDao.getByUsername(userNameWithPercents)).thenReturn(userWithPercentsInName);
        JCUser userWithPipeSymbolInName = getUser(userNameWithPipeSymbol, 101L);
        when(userDao.getByUsername(userNameWithPipeSymbol)).thenReturn(userWithPipeSymbolInName);
        //
        String withPercentsUserProfile = "/forum/users/" + userWithPercentsInName.getId();
        String withPipeSymbolUserProfile = "/forum/users/" + userWithPipeSymbolInName.getId();
        String notProcessedSource = format(MENTIONING_TEMPLATE, userNameWithPercents, userNameWithPipeSymbol);

        MentionedUsers mentionedUsers = MentionedUsers.parse(notProcessedSource);

        String expectedAfterProcess = format(MENTIONING_WITH_LINK_TO_PROFILE_TEMPALTE, withPercentsUserProfile,
                userNameWithPercents, withPipeSymbolUserProfile, userNameWithPipeSymbol);

        String actualAfterProcess = mentionedUsers.getTextWithProcessedUserTags(userDao);

        assertEquals(actualAfterProcess, expectedAfterProcess);
    }

    @Test
    public void processShouldAttachProfileLinkToExistEncodedCyrillicUsers() throws NotFoundException {
        setupRequestAttributes();

        String cyrillicCharsUserName = "%D0%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2";
        String cyrillicCharsUserNameWithSpaces = "%D0%9F %D0%B5 %D1%82 %D1%80 %D0%BE %D0%B2";

        JCUser cyrillicCharsUser = getUser("", 100L);
        when(userDao.getByUsername(cyrillicCharsUser.getUsername())).thenReturn(cyrillicCharsUser);
        JCUser cyrillicCharsWithSpacesUser = getUser("     ", 101L);
        when(userDao.getByUsername(cyrillicCharsWithSpacesUser.getUsername()))
                .thenReturn(cyrillicCharsWithSpacesUser);
        //
        String cyrillicCharsUserProfile = "/forum/users/" + cyrillicCharsUser.getId();
        String cyrillicCharsUserWithSpaceProfile = "/forum/users/" + cyrillicCharsWithSpacesUser.getId();
        String notProcessedSource = format(MENTIONING_TEMPLATE, cyrillicCharsUserName,
                cyrillicCharsUserNameWithSpaces);

        MentionedUsers mentionedUsers = MentionedUsers.parse(notProcessedSource);

        String wrongAfterProcess = format(MENTIONING_WITH_LINK_TO_PROFILE_TEMPALTE, cyrillicCharsUserProfile,
                cyrillicCharsUserName, cyrillicCharsUserWithSpaceProfile, cyrillicCharsUserNameWithSpaces);

        String actualAfterProcess = mentionedUsers.getTextWithProcessedUserTags(userDao);

        assertFalse(actualAfterProcess.equals(wrongAfterProcess),
                "Values which seems to be encoded should not be decoded.");
    }

    @Test
    public void processShouldAttachProfileLinkToExistUsersWithEncodedBracketsInName() throws NotFoundException {
        setupRequestAttributes();

        String userNameWithOpenBracket = "@ywdffgg434y@yak";
        String userNameWithCloseBracket = "@w0956756wo@yak";

        JCUser userWithOpenBracketInName = getUser("[yak", 100L);
        when(userDao.getByUsername("[yak")).thenReturn(userWithOpenBracketInName);
        JCUser userWithCloseBracketInName = getUser("]yak", 101L);
        when(userDao.getByUsername("]yak")).thenReturn(userWithCloseBracketInName);
        //
        String withOpenBracketUserProfile = "/forum/users/" + userWithOpenBracketInName.getId();
        String withCloseBracketUserProfile = "/forum/users/" + userWithCloseBracketInName.getId();
        String notProcessedSource = format(MENTIONING_TEMPLATE, userNameWithOpenBracket, userNameWithCloseBracket);

        MentionedUsers mentionedUsers = MentionedUsers.parse(notProcessedSource);

        String expectedAfterProcess = format(MENTIONING_WITH_LINK_TO_PROFILE_TEMPALTE, withOpenBracketUserProfile,
                userNameWithOpenBracket, withCloseBracketUserProfile, userNameWithCloseBracket);

        String actualAfterProcess = mentionedUsers.getTextWithProcessedUserTags(userDao);

        assertEquals(actualAfterProcess, expectedAfterProcess);
    }

    @Test
    public void processShouldAttachProfileLinkToExistUsersWithEncodedLowerGreaterInName() throws NotFoundException {
        setupRequestAttributes();

        String userNameWithLower = "gertfgertgf@@@@@#4324234yak";
        String userNameWithGreater = ">yak";

        JCUser userWithLowerInName = getUser("<yak", 100L);
        when(userDao.getByUsername("<yak")).thenReturn(userWithLowerInName);
        JCUser userWithGreaterInName = getUser(">yak", 101L);
        when(userDao.getByUsername(">yak")).thenReturn(userWithGreaterInName);
        //
        String withLowerUserProfile = "/forum/users/" + userWithLowerInName.getId();
        String withGreaterUserProfile = "/forum/users/" + userWithGreaterInName.getId();
        String notProcessedSource = format(MENTIONING_TEMPLATE, userNameWithLower, userNameWithGreater);

        MentionedUsers mentionedUsers = MentionedUsers.parse(notProcessedSource);

        String expectedAfterProcess = format(MENTIONING_WITH_LINK_TO_PROFILE_TEMPALTE, withLowerUserProfile,
                userNameWithLower, withGreaterUserProfile, userNameWithGreater);

        String actualAfterProcess = mentionedUsers.getTextWithProcessedUserTags(userDao);

        assertEquals(actualAfterProcess, expectedAfterProcess);
    }

    @Test
    public void processShouldAttachProfileLinkToExistUsersWithEncodedSlashesInName() throws NotFoundException {
        setupRequestAttributes();

        String userNameWithSlash = "/yak";
        String userNameWithBackSlash = "14@123435vggv4fyak";

        JCUser userWithSlashInName = getUser(userNameWithSlash, 100L);
        when(userDao.getByUsername(userNameWithSlash)).thenReturn(userWithSlashInName);
        JCUser userWithBackSlashInName = getUser("\\yak", 101L);
        when(userDao.getByUsername("\\yak")).thenReturn(userWithBackSlashInName);
        //
        String withSlashUserProfile = "/forum/users/" + userWithSlashInName.getId();
        String withBackSlashUserProfile = "/forum/users/" + userWithBackSlashInName.getId();
        String notProcessedSource = format(MENTIONING_TEMPLATE, userNameWithSlash, userNameWithBackSlash);

        MentionedUsers mentionedUsers = MentionedUsers.parse(notProcessedSource);

        String expectedAfterProcess = format(MENTIONING_WITH_LINK_TO_PROFILE_TEMPALTE, withSlashUserProfile,
                userNameWithSlash, withBackSlashUserProfile, userNameWithBackSlash);

        String actualAfterProcess = mentionedUsers.getTextWithProcessedUserTags(userDao);

        assertEquals(actualAfterProcess, expectedAfterProcess);
    }
}