Ejemplo n.º 1
0
    def test_view_client(self):
        user = utils.get_test_user()
        with self.settings(INSTALLED_GITSERVERS=[utils.github_config(authorized_users=[])]):
            url = reverse('ci:view_client', args=[1000,])
            response = self.client.get(url)
            self.assertEqual(response.status_code, 404)
            client = utils.create_client()

            # not logged in
            url = reverse('ci:view_client', args=[client.pk,])
            response = self.client.get(url)
            self.assertEqual(response.status_code, 200)
            self.assertContains(response, "You are not allowed")

            # logged in but not on the authorized list
            utils.simulate_login(self.client.session, user)
            response = self.client.get(url)
            self.assertEqual(response.status_code, 200)
            self.assertContains(response, "You are not allowed")

        with self.settings(INSTALLED_GITSERVERS=[utils.github_config(authorized_users=[user.name])]):
            # logged in and on the authorized list
            response = self.client.get(url)
            self.assertEqual(response.status_code, 200)
            self.assertNotContains(response, "You are not allowed")

            # Should be cached
            response = self.client.get(url)
            self.assertEqual(response.status_code, 200)
            self.assertNotContains(response, "You are not allowed")
Ejemplo n.º 2
0
    def test_job_script(self, mock_collab):
        # bad pk
        mock_collab.return_value = False
        response = self.client.get(reverse('ci:job_script', args=[1000]))
        self.assertEqual(response.status_code, 404)

        with utils.RecipeDir():
            user = utils.get_test_user()
            job = utils.create_job(user=user)
            job.recipe.build_user = user
            job.recipe.save()
            utils.create_prestepsource(recipe=job.recipe)
            utils.create_recipe_environment(recipe=job.recipe)
            step = utils.create_step(recipe=job.recipe,
                                     filename='scripts/1.sh')
            utils.create_step_environment(step=step)

            url = reverse('ci:job_script', args=[job.pk])
            response = self.client.get(url)
            # owner doesn't have permission
            self.assertEqual(response.status_code, 404)

            mock_collab.return_value = True
            utils.simulate_login(self.client.session, user)
            response = self.client.get(url)
            self.assertEqual(response.status_code, 200)
            self.assertContains(response, job.recipe.name)
Ejemplo n.º 3
0
 def setUp(self):
     self.client = Client()
     self.factory = RequestFactory()
     self.server = utils.create_git_server(
         host_type=settings.GITSERVER_BITBUCKET)
     self.user = utils.create_user_with_token(server=self.server)
     utils.simulate_login(self.client.session, self.user)
     self.gapi = self.server.api()
Ejemplo n.º 4
0
    def test_main(self):
        """
        testing ci:main
        """
        response = self.client.get(reverse('ci:main'))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, 'Sign in')
        self.assertNotContains(response, 'Sign out')

        user = utils.get_test_user()
        utils.simulate_login(self.client.session, user)
        auth = user.auth()
        self.assertIn(auth._user_key, self.client.session)
        response = self.client.get(reverse('ci:main'))
        self.assertContains(response, 'Sign out')
        self.assertNotContains(response, 'Sign in')
Ejemplo n.º 5
0
    def test_user_repo_settings(self):
        """
        testing ci:user_repo_settings
        """
        repos = []
        for i in range(3):
            repo = utils.create_repo(name="repo%s" % i)
            repo.active = True
            repo.save()
            repos.append(repo)
        # not signed in
        url = reverse('ci:user_repo_settings')
        self.set_counts()
        response = self.client.get(url)
        self.compare_counts()
        self.assertEqual(response.status_code, 200)
        self.assertNotContains(response, "form")

        user = repos[0].user
        utils.simulate_login(self.client.session, user)
        self.set_counts()
        response = self.client.get(url)
        self.compare_counts()
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "form")

        # post an invalid form
        self.set_counts()
        response = self.client.post(url, {})
        self.assertEqual(response.status_code, 200)
        self.compare_counts()

        # post a valid form
        self.set_counts()
        response = self.client.post(url, {"repositories": [repos[0].pk, repos[1].pk]})
        self.assertEqual(response.status_code, 200)
        self.assertEqual(user.preferred_repos.count(), 2)
        self.compare_counts(repo_prefs=2)

        # post again with the same recipes
        self.set_counts()
        response = self.client.post(url, {"repositories": [repos[2].pk]})
        self.assertEqual(response.status_code, 200)
        self.assertEqual(user.preferred_repos.count(), 1)
        self.compare_counts(repo_prefs=-1)
Ejemplo n.º 6
0
    def test_view_event(self, mock_collab):
        """
        testing ci:view_event
        """
        mock_collab.return_value = False
        #invalid event
        response = self.client.get(reverse('ci:view_event', args=[1000,]))
        self.assertEqual(response.status_code, 404)

        #valid event
        ev =  utils.create_event()
        response = self.client.get(reverse('ci:view_event', args=[ev.pk]))
        self.assertEqual(response.status_code, 200)

        #valid event while signed in
        user = utils.get_test_user()
        utils.simulate_login(self.client.session, user)
        response = self.client.get(reverse('ci:view_event', args=[ev.pk]))
        self.assertEqual(response.status_code, 200)
Ejemplo n.º 7
0
    def test_activate_event(self, mock_collab):
        # only posts are allowed
        response = self.client.get(reverse('ci:activate_event', args=[1000]))
        self.assertEqual(response.status_code, 405)

        response = self.client.post(reverse('ci:activate_event', args=[1000]))
        self.assertEqual(response.status_code, 404)

        job = utils.create_job()
        job.active = False
        job.save()
        self.set_counts()
        response = self.client.post(reverse('ci:activate_event', args=[job.event.pk]))
        self.compare_counts()
        # not signed in
        self.assertEqual(response.status_code, 403)

        user = utils.get_test_user()
        utils.simulate_login(self.client.session, user)
        mock_collab.return_value = False
        self.set_counts()
        response = self.client.post(reverse('ci:activate_event', args=[job.event.pk]))
        self.compare_counts()
        # not a collaborator
        self.assertEqual(response.status_code, 403)

        mock_collab.return_value = True
        # A collaborator
        self.set_counts()
        response = self.client.post(reverse('ci:activate_event', args=[job.event.pk]))
        self.compare_counts(ready=1, active=1, num_changelog=1)
        self.assertEqual(response.status_code, 302) # redirect
        job.refresh_from_db()
        self.assertTrue(job.active)

        # no jobs to activate
        self.set_counts()
        response = self.client.post(reverse('ci:activate_event', args=[job.event.pk]))
        self.compare_counts()
        self.assertEqual(response.status_code, 302) # redirect
        job.refresh_from_db()
        self.assertTrue(job.active)
Ejemplo n.º 8
0
    def test_view_profile(self):
        # invalid git server
        response = self.client.get(reverse('ci:view_profile', args=[1000, "no_exist"]))
        self.assertEqual(response.status_code, 404)

        # not signed in should redirect to sign in
        server = utils.create_git_server()
        response = self.client.get(reverse('ci:view_profile', args=[server.host_type, server.name]))
        self.assertEqual(response.status_code, 302) # redirect

        user = utils.get_test_user()
        repo1 = utils.create_repo(name='repo1', user=user)
        repo2 = utils.create_repo(name='repo2', user=user)
        repo3 = utils.create_repo(name='repo3', user=user)
        utils.create_recipe(name='r1', user=user, repo=repo1)
        utils.create_recipe(name='r2', user=user, repo=repo2)
        utils.create_recipe(name='r3', user=user, repo=repo3)
        # signed in
        utils.simulate_login(self.client.session, user)
        response = self.client.get(reverse('ci:view_profile', args=[user.server.host_type, user.server.name]))
        self.assertEqual(response.status_code, 200)
Ejemplo n.º 9
0
    def test_get_result_output(self, mock_is_collaborator):
        mock_is_collaborator.return_value = False
        url = reverse('ci:ajax:get_result_output')
        # no parameters
        response = self.client.get(url)
        self.assertEqual(response.status_code, 400)

        result = utils.create_step_result()
        result.output = 'output'
        result.save()
        result.job.recipe.private = False
        result.job.recipe.save()
        data = {'result_id': result.pk}

        # should be ok since recipe isn't private
        response = self.client.get(url, data)
        self.assertEqual(response.status_code, 200)
        json_data = response.json()
        self.assertIn(result.output, json_data["contents"])

        result.job.recipe.private = True
        result.job.recipe.save()

        # recipe is private and not signed in, shouldn't see it
        response = self.client.get(url, data)
        self.assertEqual(response.status_code, 403)

        user = utils.get_test_user()
        utils.simulate_login(self.client.session, user)
        # recipe is private, not a collaborator
        response = self.client.get(url, data)
        self.assertEqual(response.status_code, 403)

        mock_is_collaborator.return_value = True
        # recipe is private, but a collaborator
        response = self.client.get(url, data)
        self.assertEqual(response.status_code, 200)
        json_data = response.json()
        self.assertIn(result.output, json_data["contents"])
Ejemplo n.º 10
0
    def test_get_job_results(self):
        # bad pk
        url = reverse('ci:job_results', args=[1000])
        response = self.client.get(url)
        self.assertEqual(response.status_code, 404)

        user = utils.get_test_user()
        job = utils.create_job(user=user)
        step = utils.create_step(recipe=job.recipe, filename='common/1.sh')
        sr = utils.create_step_result(job=job, step=step)
        sr.output = "some output"
        sr.save()
        utils.create_step_environment(step=step)
        url = reverse('ci:job_results', args=[job.pk])
        response = self.client.get(url)
        # owner doesn't have permission
        self.assertEqual(response.status_code, 403)

        # logged in, should get the results
        utils.simulate_login(self.client.session, user)
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
Ejemplo n.º 11
0
    def test_view_pr_matched(self, mock_collab):
        user = utils.get_test_user()
        utils.simulate_login(self.client.session, user)
        mock_collab.return_value = True
        with self.settings(INSTALLED_GITSERVERS=[utils.github_config(recipe_label_activation=utils.default_labels())]):
            self.set_label_on_recipes()
            changed_files = ["docs/foo", "docs/bar"]

            self.set_counts()
            self.create_pr_data(pr_num=2, changed_files=changed_files)
            self.compare_counts(jobs=2, active=2, events=1, ready=1, prs=1, num_pr_alts=1, active_repos=1)
            pr = models.PullRequest.objects.get(number=2)
            self.assertEqual(pr.alternate_recipes.count(), 1)
            url = reverse('ci:view_pr', args=[pr.pk,])

            # try adding a default recipe
            recipes = models.Recipe.objects.order_by('created').filter(cause = models.Recipe.CAUSE_PULL_REQUEST)
            self.assertEqual(recipes.count(), 2)
            self.set_counts()
            data = {"recipes": [pr.alternate_recipes.first().pk], "default_recipes": [recipes[1].pk,]}
            response = self.client.post(url, data)
            self.assertEqual(response.status_code, 200)
            self.compare_counts(jobs=1, active=1)

            # shouldn't be able to remove one of the default
            self.set_counts()
            data["default_recipes"] = []
            response = self.client.post(url, data)
            self.assertEqual(response.status_code, 200)
            self.compare_counts()

            # try the original again, should give a form error (which we can't detect)
            data["default_recipes"] = [recipes[1].pk,]
            self.set_counts()
            response = self.client.post(url, data)
            self.assertEqual(response.status_code, 200)
            self.compare_counts()
Ejemplo n.º 12
0
 def test_user_repo_settings(self):
     user = utils.get_test_user()
     utils.simulate_login(self.client.session, user)
     self.check_url(reverse("ci:user_repo_settings"))
Ejemplo n.º 13
0
    def test_activate_job(self, mock_collab):
        # only posts are allowed
        response = self.client.get(reverse('ci:activate_job', args=[1000]))
        self.assertEqual(response.status_code, 405)

        response = self.client.post(reverse('ci:activate_job', args=[1000]))
        self.assertEqual(response.status_code, 404)

        job = utils.create_job()
        job.active = False
        job.save()
        self.set_counts()
        url = reverse('ci:activate_job', args=[job.pk])
        self.assertEqual(job.event.base.branch.status, models.JobStatus.NOT_STARTED)
        response = self.client.post(url)
        self.compare_counts()
        # not signed in
        self.assertEqual(response.status_code, 403)

        user = utils.get_test_user()
        utils.simulate_login(self.client.session, user)
        mock_collab.return_value = False
        self.set_counts()
        response = self.client.post(url)
        self.compare_counts()
        # not a collaborator
        job = models.Job.objects.get(pk=job.pk)
        self.assertEqual(response.status_code, 403)
        self.assertFalse(job.active)

        mock_collab.return_value = True
        # A collaborator
        self.set_counts()
        response = self.client.post(url)
        self.compare_counts(ready=1, active=1, num_changelog=1)
        self.assertEqual(response.status_code, 302) # redirect
        job.refresh_from_db()
        self.assertTrue(job.active)

        # make sure activating a job doesn't mark it as ready
        r1 = utils.create_recipe(name='r1')
        job.recipe.depends_on.add(r1)
        j1 = utils.create_job(recipe=r1)
        job.active = False
        job.ready = False
        job.save()
        j1.active = False
        j1.ready = False
        j1.save()
        self.set_counts()
        response = self.client.post(url)
        self.compare_counts(active=1, num_changelog=1)
        self.assertEqual(response.status_code, 302) # redirect
        job.refresh_from_db()
        self.assertTrue(job.active)
        self.assertFalse(job.ready)

        # now it should be marked as ready
        j1.ready = True
        j1.complete = True
        j1.status = models.JobStatus.SUCCESS
        j1.save()
        job.ready = False
        job.active = False
        job.save()
        self.set_counts()
        response = self.client.post(url)
        # The branch is now set to RUNNING since there is an already finished job
        self.compare_counts(ready=1, active=1, num_changelog=1, active_branches=1)
        self.assertEqual(response.status_code, 302) # redirect
        job.refresh_from_db()
        job.event.base.branch.refresh_from_db()
        self.assertEqual(job.event.base.branch.status, models.JobStatus.RUNNING)
        self.assertTrue(job.active)
        self.assertTrue(job.ready)

        # Calling activate on an already active job shouldn't do anything
        self.set_counts()
        response = self.client.post(url)
        self.compare_counts()
        self.assertEqual(response.status_code, 302) # redirect
Ejemplo n.º 14
0
    def test_job_results(self, mock_allowed, mock_is_collaborator):
        mock_is_collaborator.return_value = False
        mock_allowed.return_value = True
        url = reverse('ci:ajax:job_results')
        # no parameters
        response = self.client.get(url)
        self.assertEqual(response.status_code, 400)

        client = utils.create_client()
        step_result = utils.create_step_result()
        step_result.complete = True
        step_result.save()
        step_result.job.save()

        data = {'last_request': 10, 'job_id': 0}
        # not signed in, not a collaborator
        response = self.client.get(url, data)
        self.assertEqual(response.status_code, 404)
        data['job_id'] = step_result.job.pk
        recipe = step_result.job.recipe
        recipe.private = True
        recipe.save()
        # not signed in, not a collaborator on a private recipe
        response = self.client.get(url, data)
        self.assertEqual(response.status_code, 403)

        recipe.private = False
        recipe.save()
        # recipe no longer private, should work
        response = self.client.get(url, data)
        self.assertEqual(response.status_code, 200)
        json_data = response.json()
        self.assertEqual(json_data['job_info']['client_name'], '')
        self.assertEqual(json_data['job_info']['client_url'], '')

        user = utils.get_test_user()
        utils.simulate_login(self.client.session, user)
        mock_is_collaborator.return_value = True
        recipe.private = True
        recipe.save()

        job = step_result.job
        job.client = client
        job.save()

        # should work now
        response = self.client.get(url, data)
        self.assertEqual(response.status_code, 200)
        json_data = response.json()
        self.assertIn('job_info', json_data)
        self.assertIn('results', json_data)
        self.assertEqual(step_result.job.pk, json_data['job_info']['id'])
        self.assertEqual(step_result.pk, json_data['results'][0]['id'])
        self.assertEqual(json_data['job_info']['client_name'], client.name)

        # should work now but return no results since nothing has changed
        data['last_request'] = json_data['last_request'] + 10
        response = self.client.get(url, data)
        self.assertEqual(response.status_code, 200)
        json_data = response.json()
        self.assertIn('job_info', json_data)
        self.assertIn('results', json_data)
        # job_info is always returned
        self.assertNotEqual('', json_data['job_info'])
        self.assertEqual([], json_data['results'])
        self.assertEqual(json_data['job_info']['client_name'], '')
Ejemplo n.º 15
0
 def setUp(self):
     super(Tests, self).setUp()
     self.create_default_recipes(server_type=settings.GITSERVER_GITLAB)
     utils.simulate_login(self.client.session, self.build_user)
Ejemplo n.º 16
0
    def test_view_pr(self, mock_collab):
        """
        testing ci:view_pr
        """
        # bad pr
        url = reverse('ci:view_pr', args=[1000,])
        response = self.client.get(url)
        self.assertEqual(response.status_code, 404)
        pr = utils.create_pr()
        ev = utils.create_event()
        ev.pull_request = pr
        ev.save()
        utils.create_job(event=ev)

        user = utils.get_test_user()
        utils.simulate_login(self.client.session, user)

        # user not a collaborator, no alternate recipe form
        mock_collab.return_value = False
        url = reverse('ci:view_pr', args=[pr.pk,])
        self.set_counts()
        response = self.client.get(url)
        self.compare_counts()
        self.assertEqual(response.status_code, 200)

        # user a collaborator, they get alternate recipe form
        mock_collab.return_value = True
        r0 = utils.create_recipe(name="Recipe 0", repo=ev.base.branch.repository, cause=models.Recipe.CAUSE_PULL_REQUEST_ALT)
        r1 = utils.create_recipe(name="Recipe 1", repo=ev.base.branch.repository, cause=models.Recipe.CAUSE_PULL_REQUEST_ALT)
        self.set_counts()
        response = self.client.get(url)
        self.compare_counts()
        self.assertEqual(response.status_code, 200)

        self.set_counts()
        # post an invalid alternate recipe form
        response = self.client.post(url, {})
        self.assertEqual(response.status_code, 200)
        self.assertEqual(pr.alternate_recipes.count(), 0)
        self.compare_counts()

        utils.simulate_login(self.client.session, user)
        # post a valid alternate recipe form
        self.set_counts()
        response = self.client.post(url, {"recipes": [r0.pk, r1.pk]})
        self.assertEqual(response.status_code, 200)
        self.assertEqual(pr.alternate_recipes.count(), 2)
        # The original job plus the two alternate jobs are ready
        self.compare_counts(jobs=2, ready=3, active=2, num_pr_alts=2)

        # post again with the same recipes
        self.set_counts()
        response = self.client.post(url, {"recipes": [r0.pk, r1.pk]})
        self.assertEqual(response.status_code, 200)
        self.assertEqual(pr.alternate_recipes.count(), 2)
        self.compare_counts()

        # post again different recipes. We don't auto cancel jobs.
        self.set_counts()
        response = self.client.post(url, {"recipes": [r0.pk]})
        self.assertEqual(response.status_code, 200)
        self.assertEqual(pr.alternate_recipes.count(), 1)
        self.compare_counts(num_pr_alts=-1)

        # clear alt recipes
        self.set_counts()
        response = self.client.post(url, {"recipes": []})
        self.assertEqual(response.status_code, 200)
        self.assertEqual(pr.alternate_recipes.count(), 0)
        self.compare_counts(num_pr_alts=-1)
Ejemplo n.º 17
0
    def test_get_user_repos_info(self):
        request = self.factory.get('/')
        request.session = self.client.session
        repos = []
        for i in range(3):
            repo = utils.create_repo(name="repo%s" % i)
            repo.active = True
            repo.save()
            branch = utils.create_branch(name="branch0", user=repo.user, repo=repo)
            branch.status = models.JobStatus.SUCCESS
            branch.save()
            ev = utils.create_event(branch1=branch, branch2=branch, user=repo.user)
            utils.create_job(event=ev, user=repo.user)
            repos.append(repo)

        # user not logged in
        repo_status, evinfo, default = views.get_user_repos_info(request)
        self.assertEqual(len(repo_status), 3)
        self.assertEqual(len(evinfo), 3)
        self.assertFalse(default)

        # user not logged in, default enforced
        request = self.factory.get('/?default')
        repo_status, evinfo, default = views.get_user_repos_info(request)
        self.assertEqual(len(repo_status), 3)
        self.assertEqual(len(evinfo), 3)
        self.assertTrue(default)

        request = self.factory.get('/')
        user = repos[0].user
        utils.simulate_login(self.client.session, user)
        request.session = self.client.session
        # user is logged in but no prefs set
        repo_status, evinfo, default = views.get_user_repos_info(request)
        self.assertEqual(len(repo_status), 3)
        self.assertEqual(len(evinfo), 3)
        self.assertFalse(default)

        # user is logged in, add repos to prefs
        for i in range(3):
            user.preferred_repos.add(repos[i])
            repo_status, evinfo, default = views.get_user_repos_info(request)
            self.assertEqual(len(repo_status), i+1)
            self.assertEqual(len(evinfo), i+1)
            self.assertFalse(default)

        # user has one pref but default is enforced
        user.preferred_repos.clear()
        user.preferred_repos.add(repos[0])
        request = self.factory.get('/?default')
        repo_status, evinfo, default = views.get_user_repos_info(request)
        self.assertEqual(len(repo_status), 3)
        self.assertEqual(len(evinfo), 3)
        self.assertTrue(default)

        with self.settings(INSTALLED_GITSERVERS=[utils.github_config(hostname="server_does_not_exist")]):
            user.preferred_repos.clear()
            user.preferred_repos.add(repos[0])
            request = self.factory.get('/')
            repo_status, evinfo, default = views.get_user_repos_info(request)
            self.assertEqual(len(repo_status), 3)
            self.assertEqual(len(evinfo), 3)
            self.assertFalse(default)