/* * Copyright (C) 2012 maartenl * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package mmud.testing.tests; import java.lang.reflect.Field; import java.util.Comparator; import java.util.List; import java.util.SortedSet; import java.util.TreeSet; import java.util.logging.Logger; import javax.persistence.EntityManager; import javax.persistence.Query; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; import mmud.database.entities.characters.User; import mmud.database.entities.game.Area; import mmud.database.entities.game.Guild; import mmud.database.entities.game.Room; import mmud.exceptions.ErrorDetails; import mmud.exceptions.MudException; import mmud.exceptions.MudWebException; import mmud.rest.services.GuildBean; import mmud.rest.services.PrivateBean; import mmud.rest.webentities.PrivateMail; import mmud.rest.webentities.PrivatePerson; import mmud.testing.TestingConstants; import mmud.testing.TestingUtils; import mockit.Expectations; import mockit.Mocked; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.core.IsEqual.equalTo; import static org.testng.Assert.assertEquals; import static org.testng.Assert.fail; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; /** * * @author maartenl */ public class GuildBeanTest { // Obtain a suitable logger. private static final Logger logger = Logger.getLogger(GuildBeanTest.class.getName()); @Mocked EntityManager entityManager; @Mocked( { "ok", "status" }) javax.ws.rs.core.Response response; @Mocked MudWebException webApplicationException; @Mocked ErrorDetails errorDetails; @Mocked ResponseBuilder responseBuilder; @Mocked Query query; private User hotblack; private User marvin; private final PrivateBean privateBean = new PrivateBean() { @Override public User authenticate(String name) { if (name.equals("Hotblack")) { return hotblack; } if (name.equals("Marvin")) { return marvin; } return null; } }; public GuildBeanTest() { } @BeforeClass public void setUpClass() { } @AfterClass public void tearDownClass() { } @BeforeMethod public void setUp() throws MudException { Area aArea = TestingConstants.getArea(); Room aRoom = TestingConstants.getRoom(aArea); hotblack = TestingConstants.getHotblack(aRoom); marvin = TestingConstants.getMarvin(aRoom); } @AfterMethod public void tearDown() { } private void compare(PrivateMail actual, PrivateMail expected) { if (TestingUtils.compareBase(actual, expected)) { return; } assertEquals(actual.body, expected.body, "body:"); assertEquals(actual.deleted, expected.deleted, "deleted"); assertEquals(actual.haveread, expected.haveread, "haveread"); assertEquals(actual.id, expected.id, "id"); assertEquals(actual.item_id, expected.item_id, "item_id"); assertEquals(actual.name, expected.name, "name"); assertEquals(actual.newmail, expected.newmail, "newmail"); assertEquals(actual.subject, expected.subject, "subject"); assertEquals(actual.toname, expected.toname, "toname"); assertEquals(actual.whensent, expected.whensent, "whensent"); } /** * Marvin isn't member of a guild. */ @Test public void getMembersButNotInAGuild() throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException { logger.fine("getMembersButNotInAGuild"); GuildBean guildBean = new GuildBean() { @Override protected EntityManager getEntityManager() { return entityManager; } }; Field field = GuildBean.class.getDeclaredField("privateBean"); field.setAccessible(true); field.set(guildBean, privateBean); // Unit under test is exercised. try { List<PrivatePerson> result = guildBean.getMembers("Marvin"); fail("We are supposed to get an exception here."); } catch (WebApplicationException result) { // Yay! We get an exception! } } /** * Marvin is a member of a guild, so we are expecting a nice list of members. */ @Test public void getMembers() throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException { logger.fine("getMembers"); final Guild guild = TestingConstants.getGuild(); marvin.setGuild(guild); SortedSet<User> members = new TreeSet<>(new Comparator<User>() { @Override public int compare(User arg0, User arg1) { return arg0.getName().compareTo(arg1.getName()); } }); members.add(marvin); members.add(hotblack); guild.setMembers(members); GuildBean guildBean = new GuildBean() { @Override protected EntityManager getEntityManager() { return entityManager; } }; Field field = GuildBean.class.getDeclaredField("privateBean"); field.setAccessible(true); field.set(guildBean, privateBean); // Unit under test is exercised. List<PrivatePerson> result = guildBean.getMembers("Marvin"); assertThat(result, hasSize(2)); assertThat(result.get(0).name, equalTo("Hotblack")); assertThat(result.get(1).name, equalTo("Marvin")); } @Test public void getNoMembers() throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException { logger.fine("getNoMembers"); final Guild guild = TestingConstants.getGuild(); marvin.setGuild(guild); SortedSet<User> members = new TreeSet<>(new Comparator<User>() { @Override public int compare(User arg0, User arg1) { return arg0.getName().compareTo(arg1.getName()); } }); guild.setMembers(members); GuildBean guildBean = new GuildBean() { @Override protected EntityManager getEntityManager() { return entityManager; } }; Field field = GuildBean.class.getDeclaredField("privateBean"); field.setAccessible(true); field.set(guildBean, privateBean); // Unit under test is exercised. List<PrivatePerson> result = guildBean.getMembers("Marvin"); // Verification code (JUnit/TestNG asserts), if any. assertThat(result, hasSize(0)); } private void responseOkExpectations() { new Expectations() // an "expectation block" { { Response.ok(); result = responseBuilder; responseBuilder.build(); } }; } private void responseNoContentExpectations() { new Expectations() // an "expectation block" { { Response.noContent(); result = responseBuilder; responseBuilder.build(); } }; } }