def _create_project(self, user):
     admin = Group.objects.get(id=1)
     user.groups.add(admin)
     project = Project(name="Non Editable Project", description="Non editable description", latitude=30, longitude=30)
     project.created_by = user
     project.save()
     project.groups.add(admin)
     return project
def _create_new_project(request):
    project = Project()
    project.status = PROJECT_STATUS.DRAFT
    project.created_by = request.user
    project.save()
    project.groups = request.user.groups.all()
    return project
 def setUp(self):
     self.p = Project(name="test", description="test description", latitude=0, longitude=0, created_by_id=2)
     self.p.save()
     self.p.groups.add(Group.objects.get(id=2))
class ProjectAdminViewsUnitTest(TestCase):
    def setUp(self):
        self.p = Project(name="test", description="test description", latitude=0, longitude=0, created_by_id=2)
        self.p.save()
        self.p.groups.add(Group.objects.get(id=2))
        
    def teardown(self):
        self.p.delete()

    def test_adding_a_new_project(self):
        web_client = Client()
        self.assertTrue(web_client.login(username='******', password='******'))
        ctxt = web_client.get("/add_project?parent_id=").context
        ctxt = ( ctxt[0] if is_iter(ctxt) else ctxt )
        project_id = ctxt['project'].id
        web_client.post("/add_project?parent_id=", 
                                 {"project_id": project_id,
                                  "name" : "test_add", "description" : "test description", 
                                  "latitude" : "-70", "longitude" : "-10", 
                                  "location" : "test location", "website_url" : "www.test.com",
                                  "project_image" : "www.image.com",
                                  "project_sectors" : ("1"),
                                  "project_implementors" : ("1"),
                                  "tags": "Health Medical"})

        project = Project.objects.get(name__exact="test_add")
        self.assertTrue(project)
        self.assertTrue(PROJECT_STATUS.DRAFT, project.status)
        self.assertTrue(Sector.objects.filter(name="Health"))
        self.assertTrue(Implementor.objects.filter(name="Red Cross Foundation"))


    def test_editing_an_existing_project(self):
        web_client = Client()
        self.assertTrue(web_client.login(username='******', password='******'))
        project_id = 6
        project_links = ["http://www.link1.com", "http://www.link2.com", "http://www.link3.com"]
        web_client.post("/edit_project/6/", 
                                 {"project_id": project_id,
                                  "name" : "Edited", "description" : "editied description", 
                                  "latitude" : "30", "longitude" : "45", 
                                  "location" : "edited location", "website_url" : "http://www.edited-test.com/",
                                  "project_sectors" : ("2"),
                                  "project_implementors" : ("1"),
                                  "link_title" : ["Link 1", "Link 2", "Link 3"],
                                  "publish_project" : "on",
                                  "link_url" : project_links})
        project = Project.objects.get(id=6)
        expected_sectors = Sector.objects.filter(name="Education")
        expected_implementors = Implementor.objects.filter(Q(name="WHO") | Q(name="Red Cross Foundation"))

        self.assertEquals(u"Edited", project.name)
        self.assertTrue(project.is_published())
        self.assertEquals(u"editied description", project.description)
        self.assertEquals(30, project.latitude)
        self.assertEquals(45, project.longitude)
        self.assertEquals(u"http://www.edited-test.com/", project.website_url)
        self.assertEquals(set(expected_sectors), set(project.sector_set.all()))
        self.assertEquals(set(expected_implementors), set(project.implementor_set.all()))
        self.assertEquals(set(project_links), set([link.url for link in project.link_set.all()]))


    def test_user_can_edit_project_only_if_editor_publisher_or_creator(self):
        web_client = Client()
        self.assertTrue(web_client.login(username='******', password='******'))
        response = web_client.get("/projects/id/3/")
        self.assertNotContains(response, "Edit this project")
        web_client.logout()
        self.assertTrue(web_client.login(username='******', password='******'))
        response = web_client.get("/projects/id/3/")
        self.assertContains(response, "Edit this project")

    def test_only_editors_can_publish_projects(self): 
        web_client = Client()
        response = web_client.get("/projects/id/1/")
        self.assertNotContains(response, "Unpublish")

        web_client.login(username='******', password='******')
        response = web_client.get("/projects/id/1/")
        self.assertContains(response, "Unpublish")
        
    def test_publish_unpublish_should_update_project_status(self):
        web_client = Client()
        project = Project.objects.get(id=1)
        self.assertTrue(project.is_published())
        web_client.login(username='******', password='******')
        response = web_client.get("/projects/unpublish/1/")
        project = Project.objects.get(id=1)
        self.assertEquals(PROJECT_STATUS.UNPUBLISHED, project.status)

    def test_reject_project_should_place_the_project_in_rejected_state(self):
        web_client = Client()
        project = Project.objects.get(id=1)
        self.assertTrue(project.is_published())
        web_client.login(username='******', password='******')
        response = web_client.get("/projects/reject/1/")
        project = Project.objects.get(id=1)
        self.assertEquals(PROJECT_STATUS.REJECTED, project.status)
        
    def test_delete_project(self):
        web_client = Client()
        project = Project.objects.get(id=1)
        project_name = project.name
        web_client.login(username='******', password='******')
        response = web_client.get("/projects/delete/1/")
        self.assertFalse(Project.objects.filter(name__exact=project_name))
        
    def test_publish_project_comment(self):
        web_client = Client()
        web_client.login(username='******', password='******')
        response = web_client.post("/projects/comments/publish/", {"comment_1" : True, "project_id" : "2"})
        comment = ProjectComment.objects.get(id=1)
        self.assertEquals("Published", comment.status)
        
    def test_delete_project_comment(self):
        web_client = Client()
        web_client.login(username='******', password='******')
        web_client.post("/projects/comments/delete/", {"comment_2" : True, "project_id" : "2"})
        comment = ProjectComment.objects.filter(id=2)
        self.assertFalse(comment)

    def test_allow_only_authors_to_add_project(self):
        group = Mock()
        group.name = "User"
        user = Mock()
        user.groups.all.return_value = [group]
        meta = {'QUERY_STRING' : 'parent_id=1'}
        request = Mock()
        request.user = user 
        request.META = meta
        response = views.add_project(request)
        self.assertEquals(302, response.status_code)
        self.assertEquals('/permission_denied/add_project/not_author', response.items()[3][1])

    def test_allow_project_author_to_add_subproject(self):
        user = Mock()
        user.username = u'admin'
        self.assertTrue(views._is_author_of_parent_project(user, user))
        other_user = Mock()
        user.username = u'test'
        self.assertFalse(views._is_author_of_parent_project(user, other_user))