Package org.projectforge.humanresources

Source Code of org.projectforge.humanresources.HRPlanningTest

/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
//         www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition 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; version 3 of the License.
//
// This community edition 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 org.projectforge.humanresources;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;

import org.junit.Before;
import org.junit.Test;
import org.projectforge.access.AccessException;
import org.projectforge.access.OperationType;
import org.projectforge.common.DateHelper;
import org.projectforge.common.DateHolder;
import org.projectforge.fibu.KundeDO;
import org.projectforge.fibu.KundeDao;
import org.projectforge.fibu.ProjektDO;
import org.projectforge.test.TestBase;
import org.projectforge.user.GroupDO;
import org.projectforge.user.GroupDao;
import org.projectforge.user.PFUserDO;
import org.projectforge.user.UserGroupCache;
import org.projectforge.user.UserRightDO;
import org.projectforge.user.UserRightId;
import org.projectforge.user.UserRightValue;
import org.projectforge.user.UserRights;

public class HRPlanningTest extends TestBase
{
  private static ProjektDO projekt1, projekt2;

  private GroupDao groupDao;

  private HRPlanningDao hrPlanningDao;

  private KundeDao kundeDao;

  private UserGroupCache userGroupCache;

  private static boolean initialized;

  public void setGroupDao(GroupDao groupDao)
  {
    this.groupDao = groupDao;
  }

  public void setHrPlanningDao(HRPlanningDao hrPlanningDao)
  {
    this.hrPlanningDao = hrPlanningDao;
  }

  public void setKundeDao(KundeDao kundeDao)
  {
    this.kundeDao = kundeDao;
  }

  public void setUserGroupCache(UserGroupCache userGroupCache)
  {
    this.userGroupCache = userGroupCache;
  }

  @Before
  public void createProjekts()
  {
    if (initialized == true) {
      return;
    }
    logon(TestBase.TEST_FINANCE_USER);
    final KundeDO kunde = new KundeDO();
    kunde.setName("ACME ltd.");
    kunde.setId(59);
    kundeDao.save(kunde);
    projekt1 = initTestDB.addProjekt(kunde, 0, "Web portal");
    projekt2 = initTestDB.addProjekt(kunde, 1, "Order management");
    initialized = true;
  }

  @Test
  public void testUserRights()
  {
    PFUserDO user1 = initTestDB.addUser("HRPlanningTestUser1");
    final HRPlanningRight right = (HRPlanningRight) UserRights.instance().getRight(UserRightId.PM_HR_PLANNING);
    assertFalse(right.isAvailable(userGroupCache, user1));
    final HRPlanningDO planning = new HRPlanningDO().setUser(getUser(TestBase.TEST_USER));
    logon(user1);
    assertFalse(hrPlanningDao.hasLoggedInUserAccess(planning, null, OperationType.SELECT, false));
    try {
      hrPlanningDao.hasLoggedInUserAccess(planning, null, OperationType.SELECT, true);
      fail("AccessException excepted.");
    } catch (AccessException ex) {
      // OK
    }
    logon(TestBase.TEST_ADMIN_USER);
    GroupDO group = initTestDB.getGroup(ORGA_GROUP);
    group.getAssignedUsers().add(user1);
    groupDao.update(group);
    assertTrue(right.isAvailable(userGroupCache, user1));
    logon(user1);
    assertFalse(hrPlanningDao.hasLoggedInUserAccess(planning, null, OperationType.SELECT, false));
    assertTrue(accessChecker.hasLoggedInUserSelectAccess(UserRightId.PM_HR_PLANNING, false));
    assertFalse(accessChecker.hasLoggedInUserSelectAccess(UserRightId.PM_HR_PLANNING, planning, false));
    assertFalse(accessChecker.hasLoggedInUserHistoryAccess(UserRightId.PM_HR_PLANNING, planning, false));
    assertFalse(accessChecker.hasLoggedInUserInsertAccess(UserRightId.PM_HR_PLANNING, planning, false));
    logon(TestBase.TEST_ADMIN_USER);
    user1.addRight(new UserRightDO(user1, UserRightId.PM_HR_PLANNING, UserRightValue.READONLY));
    userDao.update(user1);
    logon(user1);
    assertTrue(hrPlanningDao.hasLoggedInUserAccess(planning, null, OperationType.SELECT, false));
    assertTrue(accessChecker.hasLoggedInUserSelectAccess(UserRightId.PM_HR_PLANNING, planning, false));
    assertTrue(accessChecker.hasLoggedInUserHistoryAccess(UserRightId.PM_HR_PLANNING, planning, false));
    assertFalse(accessChecker.hasLoggedInUserInsertAccess(UserRightId.PM_HR_PLANNING, planning, false));
    logon(TestBase.TEST_ADMIN_USER);
    user1 = userDao.getById(user1.getId());
    user1.getRight(UserRightId.PM_HR_PLANNING).setValue(UserRightValue.READWRITE);
    userDao.update(user1);
    logon(user1);
    assertTrue(hrPlanningDao.hasLoggedInUserAccess(planning, null, OperationType.SELECT, false));
    assertTrue(accessChecker.hasLoggedInUserSelectAccess(UserRightId.PM_HR_PLANNING, planning, false));
    assertTrue(accessChecker.hasLoggedInUserHistoryAccess(UserRightId.PM_HR_PLANNING, planning, false));
    assertTrue(accessChecker.hasLoggedInUserInsertAccess(UserRightId.PM_HR_PLANNING, planning, false));
  }

  @Test
  public void getFirstDayOfWeek()
  {
    final java.sql.Date date = createDate(2010, Calendar.JANUARY, 9, 1, 10, 57, 456);
    assertEquals("2010-01-04 00:00:00.000 +0000", DateHelper.formatAsUTC(HRPlanningDO.getFirstDayOfWeek(date)));
  }

  @Test
  public void testBeginOfWeek()
  {
    logon(TestBase.TEST_FINANCE_USER);
    HRPlanningDO planning = new HRPlanningDO();
    final java.sql.Date date = createDate(2010, Calendar.JANUARY, 9, 1, 10, 57, 456);
    final DateHolder firstDayOfWeek = new DateHolder(DateHelper.UTC);
    firstDayOfWeek.setDate(2010, Calendar.JANUARY, 4, 0, 0, 0, 0);
    final long millis = firstDayOfWeek.getTimeInMillis();
    planning.setFirstDayOfWeek(date);
    assertEquals("2010-01-04 00:00:00.000 +0000", DateHelper.formatAsUTC(planning.getWeek()));
    assertEquals(millis, planning.getWeek().getTime());
    // planning.setWeek(date);
    planning.setUser(getUser(TestBase.TEST_USER));
    assertEquals("2010-01-04 00:00:00.000 +0000", DateHelper.formatAsUTC(planning.getWeek()));
    final Serializable id = hrPlanningDao.save(planning);
    planning = hrPlanningDao.getById(id);
    assertEquals("2010-01-04 00:00:00.000 +0000", DateHelper.formatAsUTC(planning.getWeek()));
  }

  @Test
  public void overwriteDeletedEntries()
  {
    logon(TestBase.TEST_FINANCE_USER);
    // Create planning:
    HRPlanningDO planning = new HRPlanningDO();
    planning.setUser(getUser(TEST_USER));
    planning.setWeek(createDate(2010, Calendar.JANUARY, 11, 0, 0, 0, 0));
    assertUTCDate(planning.getWeek(), 2010, Calendar.JANUARY, 11, 0, 0, 0);
    HRPlanningEntryDO entry = new HRPlanningEntryDO();
    setHours(entry, 1, 2, 3, 4, 5, 6);
    entry.setProjekt(projekt1);
    planning.addEntry(entry);
    entry = new HRPlanningEntryDO();
    setHours(entry, 2, 4, 6, 8, 10, 12);
    entry.setStatus(HRPlanningEntryStatus.OTHER);
    planning.addEntry(entry);
    entry = new HRPlanningEntryDO();
    setHours(entry, 6, 5, 4, 3, 2, 1);
    entry.setProjekt(projekt2);
    planning.addEntry(entry);
    Serializable id = hrPlanningDao.save(planning);
    // Check saved planning
    planning = hrPlanningDao.getById(id);
    assertUTCDate(planning.getWeek(), 2010, Calendar.JANUARY, 11, 0, 0, 0);
    assertEquals(3, planning.getEntries().size());
    assertHours(planning.getProjectEntry(projekt1), 1, 2, 3, 4, 5, 6);
    assertHours(planning.getProjectEntry(projekt2), 6, 5, 4, 3, 2, 1);
    assertHours(planning.getStatusEntry(HRPlanningEntryStatus.OTHER), 2, 4, 6, 8, 10, 12);
    // Delete entry
    planning.getProjectEntry(projekt1).setDeleted(true);
    hrPlanningDao.update(planning);
    // Check deleted entry and re-adding it
    planning = hrPlanningDao.getById(id);
    assertTrue(planning.getProjectEntry(projekt1).isDeleted());
    entry = new HRPlanningEntryDO();
    setHours(entry, 7, 9, 11, 1, 3, 5);
    entry.setProjekt(projekt1);
    planning.addEntry(entry);
    hrPlanningDao.update(planning);
  }

  private void setHours(final HRPlanningEntryDO entry, final int monday, final int tuesday, final int wednesday, final int thursday,
      final int friday, final int weekend)
  {
    entry.setMondayHours(new BigDecimal(monday));
    entry.setTuesdayHours(new BigDecimal(tuesday));
    entry.setWednesdayHours(new BigDecimal(wednesday));
    entry.setThursdayHours(new BigDecimal(thursday));
    entry.setFridayHours(new BigDecimal(friday));
    entry.setWeekendHours(new BigDecimal(weekend));
  }

  private void assertHours(final HRPlanningEntryDO entry, final int monday, final int tuesday, final int wednesday, final int thursday,
      final int friday, final int weekend)
  {
    assertBigDecimal(monday, entry.getMondayHours());
    assertBigDecimal(tuesday, entry.getTuesdayHours());
    assertBigDecimal(wednesday, entry.getWednesdayHours());
    assertBigDecimal(thursday, entry.getThursdayHours());
    assertBigDecimal(friday, entry.getFridayHours());
    assertBigDecimal(weekend, entry.getWeekendHours());
  }

  private java.sql.Date createDate(int year, int month, int day, int hour, int minute, int second, int millisecond)
  {
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.GERMAN);
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.MONTH, month);
    cal.set(Calendar.DAY_OF_MONTH, day);
    cal.set(Calendar.HOUR_OF_DAY, hour);
    cal.set(Calendar.MINUTE, minute);
    cal.set(Calendar.SECOND, second);
    cal.set(Calendar.MILLISECOND, millisecond);
    return new java.sql.Date(cal.getTimeInMillis());
  }
}
TOP

Related Classes of org.projectforge.humanresources.HRPlanningTest

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.