<?php

require_once(dirname(__FILE__).'/BaseTestCase.php');

class ProjectDaoTestCase extends BaseTestCase
{
	protected $projectDao;

	function setup()
	{
		parent::setup();
		$app = Prado::getApplication();
		$this->projectDao = $app->getModule('daos')->getDao('ProjectDao');
		$this->flushDatabase();
	}


	function createNewProject()
	{
		$project = new ProjectRecord;
		$project->CreatorUserName = "admin";
		$project->DateCreated = time();
		$project->CompletionDate = strtotime('+1 month');
		$project->Description = 'Test project 1';
		$project->EstimateDuration = 100.5;
		$project->ManagerUserName = 'manager';
		$project->Name = 'Project 1';

		return $project;
	}

	function createNewProject2()
	{
		$project = new ProjectRecord;
		$project->CreatorUserName = "manager";
		$project->DateCreated = time();
		$project->CompletionDate = strtotime('+1 week');
		$project->Description = 'Test project 2';
		$project->EstimateDuration = 30.5;
		$project->ManagerUserName = 'manager';
		$project->Name = 'Project 2';

		return $project;
	}

	function createNewProject3()
	{
		$project = new ProjectRecord;
		$project->CreatorUserName = "manager";
		$project->DateCreated = time();
		$project->CompletionDate = strtotime('+1 day');
		$project->Description = 'Test project 3';
		$project->EstimateDuration = 5.0;
		$project->ManagerUserName = 'admin';
		$project->Name = 'Project 3';

		return $project;
	}

	function add3Projects()
	{
		$project1 = $this->createNewProject();
		$project2 = $this->createNewProject2();
		$project3 = $this->createNewProject3();

		$this->projectDao->addNewProject($project1);
		$this->projectDao->addNewProject($project2);
		$this->projectDao->addNewProject($project3);
		return array($project1,$project2,$project3);
	}

	function testCreateNewProject()
	{
		$newProject = $this->createNewProject();
		$this->projectDao->addNewProject($newProject);

		$check = $this->projectDao->getProjectByID(1);
		$this->assertEqual($newProject, $check);
	}

	function testDeleteProject()
	{
		$newProject = $this->createNewProject();
		$this->projectDao->addNewProject($newProject);

		$check = $this->projectDao->getProjectByID(1);
		$this->assertEqual($newProject, $check);

		$this->projectDao->deleteProject(1);
		$verify = $this->projectDao->getProjectByID(1);
		$this->assertNull($verify);
	}

	function testAddUserToProject()
	{
		$project = $this->createNewProject();
		$this->projectDao->addNewProject($project);

		$this->projectDao->addUserToProject($project->ID, 'admin');
		$this->projectDao->addUserToProject($project->ID, 'manager');

		$members = $this->projectDao->getProjectMembers($project->ID);

		$this->assertEqual(count($members), 2);
		$this->assertEqual($members[0], 'admin');
		$this->assertEqual($members[1], 'manager');
	}

	function testAddNullUserToProject()
	{
		$project = $this->createNewProject();
		$this->projectDao->addNewProject($project);
		try
		{
			$this->projectDao->addUserToProject($project->ID, 'asd');
			$this->fail();
		}
		catch(TDbException $e)
		{
			$this->pass();
		}
	}

	function testGetAllProjects()
	{
		$added = $this->add3Projects();

		$projects = $this->projectDao->getAllProjects();

		$this->assertEqual(count($projects),3);
		$this->assertEqual($added[0],$projects[0]);
		$this->assertEqual($added[1],$projects[1]);
		$this->assertEqual($added[2],$projects[2]);
	}

	function testGetProjectsByManagerName()
	{
		$added = $this->add3Projects();

		$projects = $this->projectDao->getProjectsByManagerName('manager');

		$this->assertEqual(count($projects),2);
		$this->assertEqual($added[0],$projects[0]);
		$this->assertEqual($added[1],$projects[1]);
	}

	function testGetProjectsByUserName()
	{
		$added = $this->add3Projects();

		$username = 'consultant';

		$this->projectDao->addUserToProject(1, $username);
		$this->projectDao->addUserToProject(3, $username);

		$projects = $this->projectDao->getProjectsByUserName($username);

		$this->assertEqual(count($projects),2);
		$this->assertEqual($added[0],$projects[0]);
		$this->assertEqual($added[2],$projects[1]);
	}

	function testRemoveUserFromProject()
	{
		$added = $this->add3Projects();
		$this->projectDao->addUserToProject(1, 'admin');
		$this->projectDao->addUserToProject(1, 'manager');
		$this->projectDao->addUserToProject(1, 'consultant');

		$members = $this->projectDao->getProjectMembers(1);

		$this->assertEqual(count($members), 3);
		$this->assertEqual($members[0], 'admin');
		$this->assertEqual($members[2], 'manager');
		$this->assertEqual($members[1], 'consultant');

		$this->projectDao->removeUserFromProject(1,'admin');

		$list = $this->projectDao->getProjectMembers(1);

		$this->assertEqual(count($list), 2);
		$this->assertEqual($list[1], 'manager');
		$this->assertEqual($list[0], 'consultant');
	}

	function testUpdateProject()
	{
		$project = $this->createNewProject();
		$this->projectDao->addNewProject($project);

		$project->Description = "Project Testing 123";

		$this->projectDao->updateProject($project);

		$check = $this->projectDao->getProjectByID(1);
		$this->assertEqual($check, $project);
	}
}