org.jasig.schedassist.impl.owner.SpringJDBCOwnerDaoImplTest.java Source code

Java tutorial

Introduction

Here is the source code for org.jasig.schedassist.impl.owner.SpringJDBCOwnerDaoImplTest.java

Source

/**
 * Licensed to Jasig under one or more contributor license
 * agreements. See the NOTICE file distributed with this work
 * for additional information regarding copyright ownership.
 * Jasig licenses this file to you 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 org.jasig.schedassist.impl.owner;

import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.io.IOUtils;
import org.jasig.schedassist.model.ICalendarAccount;
import org.jasig.schedassist.model.IScheduleOwner;
import org.jasig.schedassist.model.MeetingDurations;
import org.jasig.schedassist.model.Preferences;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.test.jdbc.SimpleJdbcTestUtils;

/**
 * Test harness for {@link SpringJDBCOwnerDaoImpl}.
 * 
 * Depends on {@link NeedsTestDatabase}.
 *  
 * @author Nicholas Blair
 */
public class SpringJDBCOwnerDaoImplTest extends NeedsTestDatabase {

    private SpringJDBCOwnerDaoImpl ownerDao;
    private MockCalendarAccountDao calendarAccountDao;

    /**
     * @param ownerDao the ownerDao to set
     */
    @Autowired
    public void setOwnerDao(SpringJDBCOwnerDaoImpl ownerDao) {
        this.ownerDao = ownerDao;
    }

    /**
     * @param calendarAccountDao the calendarAccountDao to set
     */
    @Autowired
    public void setCalendarAccountDao(MockCalendarAccountDao calendarAccountDao) {
        this.calendarAccountDao = calendarAccountDao;
    }

    @Override
    public void afterCreate() {
    }

    @Override
    public void afterDestroy() {
        // always clear the CalendarUserDao in case a mock was temporarily set
        ownerDao.setCalendarAccountDao(null);
    }

    /**
     * 
     * @throws Exception
     */
    @Test
    public void testRegister() throws Exception {
        ICalendarAccount user1 = this.calendarAccountDao.getCalendarAccount("user1");
        Assert.assertNotNull(user1);
        IScheduleOwner owner1 = ownerDao.register(user1);
        Assert.assertNotNull(owner1);
        Assert.assertEquals(1, owner1.getId());
        Map<Preferences, String> ownerPrefs = owner1.getPreferences();
        Assert.assertEquals(Preferences.getDefaultPreferences(), ownerPrefs);

        // test lookup methods
        Assert.assertEquals("user1", ownerDao.lookupUsername(1));
        Assert.assertEquals("10000:00001", ownerDao.lookupUniqueId(1));

        ICalendarAccount user2 = this.calendarAccountDao.getCalendarAccount("user2");
        Assert.assertNotNull(user2);
        IScheduleOwner owner2 = ownerDao.register(user2);
        Assert.assertNotNull(owner2);
        Assert.assertEquals(2, owner2.getId());
        Map<Preferences, String> owner2Prefs = owner2.getPreferences();
        Assert.assertEquals(Preferences.getDefaultPreferences(), owner2Prefs);

        Assert.assertEquals("user2", ownerDao.lookupUsername(2));
        Assert.assertEquals("10000:00002", ownerDao.lookupUniqueId(2));
    }

    /**
     * 
     * @throws Exception
     */
    @Test
    public void testRegisterAndRemove() throws Exception {
        ICalendarAccount user1 = this.calendarAccountDao.getCalendarAccount("user1");
        Assert.assertNotNull(user1);
        IScheduleOwner owner1 = ownerDao.register(user1);
        Assert.assertNotNull(owner1);
        Assert.assertEquals(1, owner1.getId());
        Map<Preferences, String> ownerPrefs = owner1.getPreferences();
        Assert.assertEquals(Preferences.getDefaultPreferences(), ownerPrefs);

        // test lookup methods
        Assert.assertEquals("user1", ownerDao.lookupUsername(1));
        Assert.assertEquals("10000:00001", ownerDao.lookupUniqueId(1));

        ownerDao.removeAccount(owner1);
        Assert.assertNull(ownerDao.lookupUsername(1));
        Assert.assertNull(ownerDao.lookupUniqueId(1));
    }

    /**
     * 
     * @throws Exception
     */
    @Test
    public void testRegisterTwice() throws Exception {
        ICalendarAccount user1 = this.calendarAccountDao.getCalendarAccount("user1");
        Assert.assertNotNull(user1);
        IScheduleOwner owner1 = ownerDao.register(user1);
        Assert.assertNotNull(owner1);
        Assert.assertEquals(1, owner1.getId());
        Map<Preferences, String> ownerPrefs = owner1.getPreferences();
        Assert.assertEquals(Preferences.getDefaultPreferences(), ownerPrefs);

        // test lookup methods
        Assert.assertEquals("user1", ownerDao.lookupUsername(1));
        Assert.assertEquals("10000:00001", ownerDao.lookupUniqueId(1));

        // try to register again
        IScheduleOwner attempt2 = ownerDao.register(user1);
        Assert.assertEquals(owner1, attempt2);
    }

    /**
     * 
     * @throws Exception
     */
    @Test
    public void testUpdatePreference() throws Exception {
        ICalendarAccount user1 = this.calendarAccountDao.getCalendarAccount("user1");
        Assert.assertNotNull(user1);
        IScheduleOwner owner1 = ownerDao.register(user1);
        Assert.assertNotNull(owner1);
        Assert.assertEquals(1, owner1.getId());
        Map<Preferences, String> ownerPrefs = owner1.getPreferences();
        Assert.assertEquals(Preferences.getDefaultPreferences(), ownerPrefs);

        owner1 = ownerDao.updatePreference(owner1, Preferences.LOCATION, "My new office!");
        Assert.assertEquals("My new office!", owner1.getPreference(Preferences.LOCATION));

        String storedValue = ownerDao.retreivePreference(owner1, Preferences.LOCATION);
        Assert.assertEquals("My new office!", storedValue);

        MeetingDurations maxDurations = MeetingDurations.fromKey("240,480");
        owner1 = ownerDao.updatePreference(owner1, Preferences.DURATIONS, maxDurations.getKey());

        Assert.assertEquals(480, owner1.getPreferredMeetingDurations().getMaxLength());
        Assert.assertEquals(240, owner1.getPreferredMeetingDurations().getMinLength());

        owner1 = ownerDao.updatePreference(owner1, Preferences.DURATIONS, Preferences.DURATIONS.getDefaultValue());
        Assert.assertEquals(30, owner1.getPreferredMeetingDurations().getMaxLength());
        Assert.assertEquals(30, owner1.getPreferredMeetingDurations().getMinLength());
    }

    /**
     * <ol>
     * <li>Register a calendar account, set some preferences.</li>
     * <li>Change the calendar account's unique id.</li>
     * <li>Verify the ownerDao returns the same schedule owner</li>
     * </ol>
     * 
     * @throws IneligibleException 
     */
    @Test
    public void testExternalUniqueIdChanges() throws IneligibleException {
        ICalendarAccount user = this.calendarAccountDao.getCalendarAccount("user4");
        Assert.assertNotNull(user);
        IScheduleOwner owner = ownerDao.register(user);
        Assert.assertNotNull(owner);
        Assert.assertEquals(1, owner.getId());
        Map<Preferences, String> ownerPrefs = owner.getPreferences();
        Assert.assertEquals(Preferences.getDefaultPreferences(), ownerPrefs);

        IScheduleOwner updated = ownerDao.updatePreference(owner, Preferences.LOCATION, "My new office!");
        Assert.assertEquals("My new office!", updated.getPreference(Preferences.LOCATION));

        String storedValue = ownerDao.retreivePreference(owner, Preferences.LOCATION);
        Assert.assertEquals("My new office!", storedValue);

        ICalendarAccount updatedUser = this.calendarAccountDao.changeAccountUniqueId(user, "23000:10001");

        IScheduleOwner target = this.ownerDao.locateOwner(updatedUser);
        Assert.assertNotNull(target);
        Assert.assertEquals(updated.getId(), target.getId());
        Assert.assertEquals(updated.getPreferredLocation(), target.getPreferredLocation());
    }

    /**
     * <ol>
     * <li>Register a calendar account, set some preferences.</li>
     * <li>Change the calendar account's username</li>
     * <li>Verify the ownerDao returns the same schedule owner</li>
     * </ol>
     * 
     * @throws IneligibleException 
     */
    @Test
    public void testUsernameChanges() throws IneligibleException {
        ICalendarAccount user = this.calendarAccountDao.getCalendarAccount("user5");
        Assert.assertNotNull(user);
        IScheduleOwner owner = ownerDao.register(user);
        Assert.assertNotNull(owner);
        Assert.assertEquals(1, owner.getId());
        Map<Preferences, String> ownerPrefs = owner.getPreferences();
        Assert.assertEquals(Preferences.getDefaultPreferences(), ownerPrefs);

        IScheduleOwner updated = ownerDao.updatePreference(owner, Preferences.LOCATION, "My new office!");
        Assert.assertEquals("My new office!", updated.getPreference(Preferences.LOCATION));

        String storedValue = ownerDao.retreivePreference(owner, Preferences.LOCATION);
        Assert.assertEquals("My new office!", storedValue);

        ICalendarAccount updatedUser = this.calendarAccountDao.changeAccountUsername(user, "altered-username5");

        IScheduleOwner target = this.ownerDao.locateOwner(updatedUser);
        Assert.assertNotNull(target);
        Assert.assertEquals(updated.getId(), target.getId());
        Assert.assertEquals(updated.getPreferredLocation(), target.getPreferredLocation());
    }

    /**
     * <ol>
     * <li>Register a calendar account, set some preferences.</li>
     * <li>Change the calendar account's username</li>
     * <li>Verify the ownerDao returns the same schedule owner</li>
     * </ol>
     * 
     * Takes a slightly different path than {@link #testUsernameChanges()}.
     * 
     * @throws Exception
     */
    @Test
    public void testLookupByIdUsernameChanged() throws Exception {
        ICalendarAccount user = this.calendarAccountDao.getCalendarAccount("user6");
        Assert.assertNotNull(user);
        IScheduleOwner owner = ownerDao.register(user);
        Assert.assertNotNull(owner);
        Assert.assertEquals(1, owner.getId());
        Map<Preferences, String> ownerPrefs = owner.getPreferences();
        Assert.assertEquals(Preferences.getDefaultPreferences(), ownerPrefs);

        IScheduleOwner updated = ownerDao.updatePreference(owner, Preferences.LOCATION, "My new office!");
        Assert.assertEquals("My new office!", updated.getPreference(Preferences.LOCATION));

        String storedValue = ownerDao.retreivePreference(owner, Preferences.LOCATION);
        Assert.assertEquals("My new office!", storedValue);

        ICalendarAccount updatedUser = this.calendarAccountDao.changeAccountUsername(user, "altered-username6");
        Assert.assertEquals("altered-username6", updatedUser.getUsername());

        // ownerDao needs a reference to the calendardao
        this.ownerDao.setCalendarAccountDao(this.calendarAccountDao);
        IScheduleOwner target = this.ownerDao.locateOwnerByAvailableId(1L);
        Assert.assertNotNull(target);
        Assert.assertEquals(updated.getId(), target.getId());
        Assert.assertEquals(updated.getPreferredLocation(), target.getPreferredLocation());
        Assert.assertEquals(updatedUser.getUsername(), target.getCalendarAccount().getUsername());
    }

    /**
     * 
     * @throws Exception
     */
    @Before
    public void createDatabase() throws Exception {
        Resource createDdl = (Resource) this.applicationContext.getBean("createDdl");

        SimpleJdbcTemplate template = new SimpleJdbcTemplate(
                (DataSource) this.applicationContext.getBean("dataSource"));
        SimpleJdbcTestUtils.executeSqlScript(template, createDdl, false);
    }

    /**
     * 
     * @throws Exception
     */
    @After
    public void destroyDatabase() throws Exception {
        Resource destroyDdl = (Resource) this.applicationContext.getBean("destroyDdl");

        String sql = IOUtils.toString(destroyDdl.getInputStream());
        JdbcTemplate template = new JdbcTemplate((DataSource) this.applicationContext.getBean("dataSource"));
        template.execute(sql);

        // always clear the CalendarUserDao in case a mock was temporarily set
        ownerDao.setCalendarAccountDao(null);
    }
}