Ejemplo n.º 1
0
 def test_good_token_but_non_member(self):
     non_member = User.objects.create(username='******')
     Token.objects.create(user=non_member, key='nonmemberkey')
     client = APIClient('nonmemberkey')
     response = client.post('/api/submit/mygroup/myproject/1.0.0/myenvironment')
     self.assertEqual(response.status_code, 403)
     self.assertEqual(models.TestRun.objects.count(), 0)
Ejemplo n.º 2
0
 def test_good_token_but_non_member(self):
     non_member = User.objects.create(username='******')
     Token.objects.create(user=non_member, key='nonmemberkey')
     client = APIClient('nonmemberkey')
     response = client.post('/api/submit/mygroup/myproject/1.0.0/myenvironment')
     self.assertEqual(response.status_code, 403)
     self.assertEqual(models.TestRun.objects.count(), 0)
Ejemplo n.º 3
0
 def test_good_token_for_member_with_submit_access(self):
     member = User.objects.create(username='******')
     self.group.add_user(member, 'submitter')
     Token.objects.create(user=member, key='memberkey')
     client = APIClient('memberkey')
     response = client.post('/api/submit/mygroup/myproject/1.0.16/myenvironment')
     self.assertEqual(response.status_code, 201)
     self.assertEqual(models.TestRun.objects.count(), 1)
Ejemplo n.º 4
0
 def test_good_token_for_member_with_submit_access(self):
     member = User.objects.create(username='******')
     self.group.add_user(member, 'submitter')
     Token.objects.create(user=member, key='memberkey')
     client = APIClient('memberkey')
     response = client.post('/api/submit/mygroup/myproject/1.0.0/myenvironment')
     self.assertEqual(response.status_code, 201)
     self.assertEqual(models.TestRun.objects.count(), 1)
Ejemplo n.º 5
0
class TestApiUpperCaseSlug(TestCase):

    def setUp(self):
        self.group = models.Group.objects.create(slug='MyGroup')
        self.project = self.group.projects.create(slug='MyProject')
        self.project.tokens.create(key='thekey')
        self.client = APIClient('thekey')

    def test_accepts_uppercase_in_slug(self):
        response = self.client.post('/api/submit/MyGroup/MyProject/1.0.0/MyEnvironment')
        self.assertEqual(response.status_code, 201)
Ejemplo n.º 6
0
class CiApiTest(TestCase):
    def setUp(self):
        self.group = core_models.Group.objects.create(slug='mygroup')
        self.project = self.group.projects.create(slug='myproject')

        self.project_admin_user = User.objects.create(username='******')
        self.group.add_admin(self.project_admin_user)
        self.project_submission_user = User.objects.create(
            username='******')
        self.group.add_user(self.project_submission_user, 'submitter')
        self.project_member_user = User.objects.create(
            username='******')
        self.group.add_user(self.project_member_user, 'member')
        self.build = self.project.builds.create(version='1')
        Token.objects.create(user=self.project_submission_user, key='thekey')
        Token.objects.create(user=self.project_member_user, key='memberkey')
        Token.objects.create(user=self.project_admin_user, key='adminkey')

        self.backend = models.Backend.objects.create(
            name='lava', implementation_type='fake')
        self.client = APIClient('thekey')
        self.restclient = RestAPIClient('thekey')
        self.memberclient = APIClient('memberkey')
        self.adminclient = APIClient('adminkey')

    def test_auth(self):
        args = {
            'backend': 'lava',
            'definition': 'foo: 1',
        }
        self.client.token = 'invalid-token'
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(403, r.status_code)

    def test_creates_test_run(self):
        args = {
            'backend': 'lava',
            'definition': 'foo: 1',
        }
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(201, r.status_code)
        self.assertEqual(
            1,
            models.TestJob.objects.filter(
                target=self.project,
                environment='myenv',
                target_build=self.build,
                backend=self.backend,
                definition='foo: 1',
            ).count())

    def test_invalid_backend_test_run(self):
        args = {
            'backend': 'lava.foo',
            'definition': 'foo: 1',
        }
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(400, r.status_code)

    def test_missing_definition_test_run(self):
        args = {'backend': 'lava'}
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(400, r.status_code)

    def test_accepts_definition_as_file_upload(self):
        args = {
            'backend': 'lava',
            'definition': open(twoline_job_definition_file)
        }
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(201, r.status_code)
        testjob = models.TestJob.objects.filter(
            target=self.project,
            environment='myenv',
            target_build=self.build,
            backend=self.backend,
            definition='bar: something\nfoo: 1',
        ).get()
        # when parsing back to yaml, it weirdly adds an extra linebreak at the end
        self.assertEqual('bar: something\nfoo: 1\n', testjob.show_definition)

    @patch("squad.ci.tasks.submit.delay")
    def test_schedules_submission(self, submit):
        args = {
            'backend': 'lava',
            'definition': 'foo: 1',
        }
        self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        job_id = models.TestJob.objects.last().id
        submit.assert_called_with(job_id)

    @patch("squad.ci.tasks.fetch.delay")
    def test_auth_on_watch_testjob(self, fetch):
        testjob_id = 1234
        args = {
            'backend': 'lava',
            'testjob_id': testjob_id,
        }
        self.client.token = 'invalid-token'
        r = self.client.post('/api/watchjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(403, r.status_code)

    @patch("squad.ci.tasks.fetch.delay")
    def test_watch_testjob(self, fetch):
        testjob_id = 1234
        args = {
            'backend': 'lava',
            'testjob_id': testjob_id,
        }
        r = self.client.post('/api/watchjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(201, r.status_code)
        self.assertEqual(
            1,
            models.TestJob.objects.filter(target=self.project,
                                          environment='myenv',
                                          target_build=self.build,
                                          backend=self.backend,
                                          submitted=True,
                                          job_id=testjob_id).count())

    @patch("squad.ci.tasks.fetch.delay")
    def test_watch_testjob_mising_id(self, fetch):
        args = {'backend': 'lava'}
        r = self.client.post('/api/watchjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(400, r.status_code)

    @patch('squad.ci.models.Backend.get_implementation')
    def test_resubmit_submitter(self, get_implementation):
        impl = MagicMock()
        impl.resubmit = MagicMock()
        get_implementation.return_value = impl

        t = self.backend.test_jobs.create(target=self.project,
                                          can_resubmit=True)
        r = self.client.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(201, r.status_code)
        impl.resubmit.assert_called()
        t.refresh_from_db()
        self.assertEqual(False, t.can_resubmit)

    @patch('squad.ci.models.Backend.get_implementation')
    def test_resubmit_submitter_cant_resubmit(self, get_implementation):
        impl = MagicMock()
        impl.resubmit = MagicMock()
        get_implementation.return_value = impl

        t = self.backend.test_jobs.create(target=self.project,
                                          can_resubmit=False)
        r = self.client.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(403, r.status_code)
        impl.resubmit.assert_not_called()
        t.refresh_from_db()
        self.assertEqual(False, t.can_resubmit)

    @patch('squad.ci.models.Backend.get_implementation')
    def test_resubmit_submitter_token_auth(self, get_implementation):
        impl = MagicMock()
        impl.resubmit = MagicMock()
        get_implementation.return_value = impl

        t = self.backend.test_jobs.create(target=self.project,
                                          can_resubmit=True)

        r = self.restclient.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(201, r.status_code)
        impl.resubmit.assert_called()
        t.refresh_from_db()
        self.assertEqual(False, t.can_resubmit)

    @patch('squad.ci.models.Backend.get_implementation')
    def test_resubmit_submitter_auth_token_cant_resubmit(
            self, get_implementation):
        impl = MagicMock()
        impl.resubmit = MagicMock()
        get_implementation.return_value = impl

        t = self.backend.test_jobs.create(target=self.project,
                                          can_resubmit=False)

        r = self.restclient.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(403, r.status_code)
        impl.resubmit.assert_not_called()
        t.refresh_from_db()
        self.assertEqual(False, t.can_resubmit)

    @patch('squad.ci.models.Backend.get_implementation')
    def test_force_resubmit_submitter_token_auth(self, get_implementation):
        impl = MagicMock()
        impl.resubmit = MagicMock()
        get_implementation.return_value = impl

        t = self.backend.test_jobs.create(target=self.project,
                                          can_resubmit=True)

        r = self.restclient.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(201, r.status_code)
        impl.resubmit.assert_called()
        t.refresh_from_db()
        self.assertEqual(False, t.can_resubmit)

    @patch('squad.ci.models.Backend.get_implementation')
    def test_resubmit_admin(self, get_implementation):
        impl = MagicMock()
        impl.resubmit = MagicMock()
        get_implementation.return_value = impl

        t = self.backend.test_jobs.create(target=self.project,
                                          can_resubmit=True)
        r = self.adminclient.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(201, r.status_code)
        impl.resubmit.assert_called()
        t.refresh_from_db()
        self.assertEqual(False, t.can_resubmit)

    def test_disallowed_resubmit(self):
        t = self.backend.test_jobs.create(target=self.project,
                                          can_resubmit=True)
        r = self.memberclient.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(401, r.status_code)

    def test_resubmit_invalid_id(self):
        staff_user_password = "******"
        staff_user = User.objects.create_superuser(
            username="******",
            email="*****@*****.**",
            password=staff_user_password,
            is_staff=True)
        staff_user.save()
        client = Client()
        client.login(username=staff_user.username,
                     password=staff_user_password)

        r = client.post('/api/resubmit/999')
        self.assertEqual(404, r.status_code)
Ejemplo n.º 7
0
class CiApiTest(TestCase):
    def setUp(self):
        self.group = core_models.Group.objects.create(slug='mygroup')
        self.project = self.group.projects.create(slug='myproject')
        self.project.tokens.create(key='thekey')
        self.backend = models.Backend.objects.create(name='lava')
        self.client = APIClient('thekey')

    def test_creates_test_run(self):
        args = {
            'backend': 'lava',
            'definition': 'foo: 1',
        }
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(201, r.status_code)
        self.assertEqual(
            1,
            models.TestJob.objects.filter(
                target=self.project,
                environment='myenv',
                build='1',
                backend=self.backend,
                definition='foo: 1',
            ).count())

    def test_invalid_backend_test_run(self):
        args = {
            'backend': 'lava.foo',
            'definition': 'foo: 1',
        }
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(400, r.status_code)

    def test_missing_definition_test_run(self):
        args = {'backend': 'lava'}
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(400, r.status_code)

    def test_accepts_definition_as_file_upload(self):
        args = {'backend': 'lava', 'definition': open(job_definition_file)}
        self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)

    @patch("squad.ci.tasks.submit.delay")
    def test_schedules_submission(self, submit):
        args = {
            'backend': 'lava',
            'definition': 'foo: 1',
        }
        self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        job_id = models.TestJob.objects.last().id
        submit.assert_called_with(job_id)

    @patch("squad.ci.tasks.fetch.delay")
    def test_watch_testjob(self, fetch):
        testjob_id = 1234
        args = {
            'backend': 'lava',
            'testjob_id': testjob_id,
        }
        r = self.client.post('/api/watchjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(201, r.status_code)
        self.assertEqual(
            1,
            models.TestJob.objects.filter(target=self.project,
                                          environment='myenv',
                                          build='1',
                                          backend=self.backend,
                                          job_id=testjob_id).count())

    @patch("squad.ci.tasks.fetch.delay")
    def test_watch_testjob_mising_id(self, fetch):
        args = {'backend': 'lava'}
        r = self.client.post('/api/watchjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(400, r.status_code)

    @patch('squad.ci.models.Backend.get_implementation')
    def test_resubmit(self, get_implementation):
        impl = MagicMock()
        impl.resubmit = MagicMock()
        get_implementation.return_value = impl

        t = self.backend.test_jobs.create(target=self.project,
                                          can_resubmit=True)
        r = self.client.get('/api/resubmit/%s' % t.pk)
        self.assertEqual(201, r.status_code)
        impl.resubmit.assert_called()
        t.refresh_from_db()
        self.assertEqual(False, t.can_resubmit)

    def test_resubmit_invalid_id(self):
        r = self.client.get('/api/resubmit/999')
        self.assertEqual(400, r.status_code)
Ejemplo n.º 8
0
class ApiTest(TestCase):

    def setUp(self):

        self.group = models.Group.objects.create(slug='mygroup')
        self.project = self.group.projects.create(slug='myproject')
        self.project.tokens.create(key='thekey')

        self.client = APIClient('thekey')

    def test_create_object_hierarchy(self):
        response = self.client.post('/api/submit/mygroup/myproject/1.0.0/myenvironment')
        self.assertEqual(response.status_code, 201)

        self.project.builds.get(version='1.0.0')
        self.project.environments.get(slug='myenvironment')

    def test_create_test_run(self):
        test_runs = models.TestRun.objects.count()
        self.client.post('/api/submit/mygroup/myproject/1.0.0/myenvironment')
        self.assertEqual(test_runs + 1, models.TestRun.objects.count())

    def test_receives_tests_file(self):
        with open(tests_file) as f:
            self.client.post(
                '/api/submit/mygroup/myproject/1.0.0/myenvironment',
                {'tests': f}
            )
        self.assertIsNotNone(models.TestRun.objects.last().tests_file)
        self.assertNotEqual(0, models.Test.objects.count())

    def test_receives_tests_file_as_POST_param(self):
        self.client.post(
            '/api/submit/mygroup/myproject/1.0.0/myenvironment',
            {'tests': '{"test1": "pass"}'}
        )
        self.assertIsNotNone(models.TestRun.objects.last().tests_file)
        self.assertNotEqual(0, models.Test.objects.count())

    def test_receives_metrics_file(self):
        with open(metrics_file) as f:
            self.client.post(
                '/api/submit/mygroup/myproject/1.0.0/myenvironment',
                {'metrics': f}
            )
        self.assertIsNotNone(models.TestRun.objects.last().metrics_file)
        self.assertNotEqual(0, models.Metric.objects.count())

    def test_receives_metrics_file_as_POST_param(self):
        self.client.post(
            '/api/submit/mygroup/myproject/1.0.0/myenvironment',
            {'metrics': '{"metric1": 10}'}
        )
        self.assertIsNotNone(models.TestRun.objects.last().metrics_file)
        self.assertNotEqual(0, models.Metric.objects.count())

    def test_receives_log_file(self):
        with open(log_file) as f:
            self.client.post('/api/submit/mygroup/myproject/1.0.0/myenvironment',
                             {'log': f})
        self.assertIsNotNone(models.TestRun.objects.last().log_file)

    def test_receives_log_file_as_POST_param(self):
        self.client.post('/api/submit/mygroup/myproject/1.0.0/myenvironment',
                         {'log': "THIS IS THE LOG"})
        self.assertIsNotNone(models.TestRun.objects.last().log_file)

    def test_process_data_on_submission(self):
        self.client.post(
            '/api/submit/mygroup/myproject/1.0.0/myenvironment',
            {
                'tests': open(tests_file),
                'metrics': open(metrics_file),
            }
        )
        self.assertNotEqual(0, models.Test.objects.count())
        self.assertNotEqual(0, models.Metric.objects.count())
        self.assertNotEqual(0, models.Status.objects.count())

    def test_receives_metadata_file(self):
        self.client.post(
            '/api/submit/mygroup/myproject/1.0.0/myenvironment',
            {
                'metadata': open(metadata_file),
            }
        )
        t = models.TestRun.objects.last()
        self.assertEqual("2016-09-01T00:00:00+00:00", t.datetime.isoformat())

    def test_receives_metadata_file_as_POST_param(self):
        self.client.post(
            '/api/submit/mygroup/myproject/1.0.0/myenvironment',
            {
                'metadata': '{"job_id": "123", "datetime": "2016-09-01T00:00:00+00:00"}',
            }
        )
        t = models.TestRun.objects.last()
        self.assertEqual("2016-09-01T00:00:00+00:00", t.datetime.isoformat())

    def test_receives_metadata_fields_as_POST_params(self):
        self.client.post(
            '/api/submit/mygroup/myproject/1.0.0/myenvironment',
            {
                "build_url": "http://example.com/build/1",
                "datetime": "2016-09-01T00:00:00+00:00",
                "job_id": "123",
                "job_status": "Complete",
                "job_url": "http://example.com/build/1/jobs/1",
                "resubmit_url": "http://example.com/build/1/jobs/1/resubmit",
            }
        )

        t = models.TestRun.objects.last()
        self.assertEqual("2016-09-01T00:00:00+00:00", t.datetime.isoformat())
        self.assertIsNotNone(t.build_url)
        self.assertIsNotNone(t.job_id)
        self.assertIsNotNone(t.job_status)
        self.assertIsNotNone(t.job_url)
        self.assertIsNotNone(t.resubmit_url)

    def test_stores_metadata_file(self):
        self.client.post(
            '/api/submit/mygroup/myproject/1.0.0/myenvironment',
            {
                'metadata': open(metadata_file),
            }
        )
        t = models.TestRun.objects.last()
        self.assertEqual(open(metadata_file).read(), t.metadata_file)

    def test_attachment(self):
        self.client.post(
            '/api/submit/mygroup/myproject/1.0.0/myenvironment',
            {
                'attachment': open(metadata_file),
            }
        )
        t = models.TestRun.objects.last()
        attachment = t.attachments.first()
        self.assertEqual(open(metadata_file, mode='rb').read(), bytes(attachment.data))

    def test_multiple_attachments(self):
        self.client.post(
            '/api/submit/mygroup/myproject/1.0.0/myenvironment',
            {
                'attachment': [
                    open(metadata_file),
                    open(log_file),
                ]
            }
        )
        t = models.TestRun.objects.last()
        self.assertIsNotNone(t.attachments.get(filename=os.path.basename(metadata_file)))
        self.assertIsNotNone(t.attachments.get(filename=os.path.basename(log_file)))

    def test_unauthorized(self):
        client = Client()  # regular client without auth support
        response = client.post('/api/submit/mygroup/myproject/1.0.0/myenvironment')
        self.assertEqual(response.status_code, 401)
        self.assertEqual(models.TestRun.objects.count(), 0)

    def test_forbidden(self):
        self.client.token = 'wrongtoken'
        response = self.client.post('/api/submit/mygroup/myproject/1.0.0/myenv')
        self.assertEqual(response.status_code, 403)
        self.assertEqual(models.TestRun.objects.count(), 0)

    def test_auth_with_global_token(self):
        global_token = models.Token.objects.create()
        self.client.token = global_token.key
        response = self.client.post('/api/submit/mygroup/myproject/1.0.0/myenvironment')
        self.assertEqual(201, response.status_code)
        self.assertEqual(1, models.TestRun.objects.count())

    def test_404_on_non_existing_group(self):
        response = self.client.post('/api/submit/mygrouppp/myproject/1.0.0/myenv')
        self.assertEqual(404, response.status_code)

    def test_404_on_non_existing_project(self):
        response = self.client.post('/api/submit/mygroup/myprojectttt/1.0.0/myenv')
        self.assertEqual(404, response.status_code)

    def test_invalid_metrics_json(self):
        response = self.client.post(
            '/api/submit/mygroup/myproject/1.0.0/myenvironment',
            {
                'metrics': invalid_json(),
            }
        )
        self.assertEqual(400, response.status_code)

    def test_invalid_tests_json(self):
        response = self.client.post(
            '/api/submit/mygroup/myproject/1.0.0/myenvironment',
            {
                'tests': invalid_json(),
            }
        )
        self.assertEqual(400, response.status_code)

    def test_invalid_metadata_json(self):
        response = self.client.post(
            '/api/submit/mygroup/myproject/1.0.0/myenvironment',
            {
                'metadata': invalid_json(),
            }
        )
        self.assertEqual(400, response.status_code)

    def test_reject_submission_without_job_id(self):
        response = self.client.post(
            '/api/submit/mygroup/myproject/1.0.0/myenvironment',
            {
                'metadata': StringIO('{"datetime": "2016-09-01T00:00:00+00:00"}'),
            }
        )
        self.assertEqual(400, response.status_code)

    def test_reject_submission_with_existing_job_id(self):
        def post():
            return self.client.post(
                '/api/submit/mygroup/myproject/1.0.0/myenvironment',
                {
                    'metadata': open(metadata_file),
                }
            )

        first = post()
        second = post()

        self.assertEqual(201, first.status_code)
        self.assertEqual(400, second.status_code)
Ejemplo n.º 9
0
class CiApiTest(TestCase):

    def setUp(self):
        self.group = core_models.Group.objects.create(slug='mygroup')
        self.usergroup = core_models.UserNamespace.objects.create(slug='~project-member-user')
        self.project = self.group.projects.create(slug='myproject')
        self.userproject = self.usergroup.projects.create(slug='userproject')

        self.project_admin_user = User.objects.create(username='******')
        self.group.add_admin(self.project_admin_user)
        self.project_privileged_user = User.objects.create(username='******')
        self.group.add_user(self.project_privileged_user, 'privileged')
        self.project_submitter_level_user = User.objects.create(username='******')
        self.group.add_user(self.project_submitter_level_user, 'submitter')
        self.project_member_user = User.objects.create(username='******')
        self.group.add_user(self.project_member_user, 'member')
        self.usergroup.add_user(self.project_member_user, 'privileged')
        self.build = self.project.builds.create(version='1')
        self.userbuild = self.userproject.builds.create(version='1')
        Token.objects.create(user=self.project_privileged_user, key='thekey')
        Token.objects.create(user=self.project_submitter_level_user, key='thesubmitterkey')
        Token.objects.create(user=self.project_member_user, key='memberkey')
        Token.objects.create(user=self.project_admin_user, key='adminkey')

        self.backend = models.Backend.objects.create(name='lava', implementation_type='fake')
        self.client = APIClient('thekey')
        self.submitter_client = APIClient('thesubmitterkey')
        self.restclient = RestAPIClient('thekey')
        self.memberclient = APIClient('memberkey')
        self.adminclient = APIClient('adminkey')

    def test_auth(self):
        self.client.token = 'invalid-token'

        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv')
        self.assertEqual(403, r.status_code)
        self.assertEqual('User needs permission to submit test jobs.', r.json()['detail'])

        r = self.client.post('/api/watchjob/mygroup/myproject/1/myenv')
        self.assertEqual(403, r.status_code)
        self.assertEqual('User needs permission to submit test jobs.', r.json()['detail'])

    def test_group_project_not_found(self):
        r = self.client.post('/api/submitjob/nonexistentgroup/myproject/1/myenv')
        self.assertEqual(404, r.status_code)
        self.assertEqual('No Group matches the given query.', r.json()['detail'])

        r = self.client.post('/api/submitjob/mygroup/nonexistentproject/1/myenv')
        self.assertEqual(404, r.status_code)
        self.assertEqual('No Project matches the given query.', r.json()['detail'])

    def test_creates_test_run(self):
        args = {
            'backend': 'lava',
            'definition': 'foo: 1',
        }
        r = self.submitter_client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(403, r.status_code)
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(201, r.status_code)
        testjob_queryset = models.TestJob.objects.filter(
            target=self.project,
            environment='myenv',
            target_build=self.build,
            backend=self.backend,
            definition='foo: 1',
        )
        self.assertEqual(
            1,
            testjob_queryset.count()
        )
        logentry_queryset = LogEntry.objects.filter(
            user_id=self.project_privileged_user.pk,
            object_id=testjob_queryset.last().pk
        )
        self.assertEqual(
            1,
            logentry_queryset.count()
        )
        self.assertEqual(
            ADDITION,
            logentry_queryset.last().action_flag
        )

    def test_submitjob_private_group(self):
        args = {
            'backend': 'lava',
            'definition': 'foo: 1',
        }
        r = self.memberclient.post('/api/submitjob/~project-member-user/userproject/1/myenv', args)
        self.assertEqual(201, r.status_code)
        testjob_queryset = models.TestJob.objects.filter(
            target=self.userproject,
            environment='myenv',
            target_build=self.userbuild,
            backend=self.backend,
            definition='foo: 1',
        )
        self.assertEqual(
            1,
            testjob_queryset.count()
        )
        logentry_queryset = LogEntry.objects.filter(
            user_id=self.project_member_user.pk,
            object_id=testjob_queryset.last().pk
        )
        self.assertEqual(
            1,
            logentry_queryset.count()
        )
        self.assertEqual(
            ADDITION,
            logentry_queryset.last().action_flag
        )

    def test_invalid_backend_test_run(self):
        args = {
            'backend': 'lava.foo',
            'definition': 'foo: 1',
        }
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(400, r.status_code)

    def test_missing_definition_test_run(self):
        args = {
            'backend': 'lava'
        }
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(400, r.status_code)

    def test_accepts_definition_as_file_upload(self):
        args = {
            'backend': 'lava',
            'definition': open(twoline_job_definition_file)
        }
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(201, r.status_code)
        testjob = models.TestJob.objects.filter(
            target=self.project,
            environment='myenv',
            target_build=self.build,
            backend=self.backend,
            definition='bar: something\nfoo: 1',
        ).get()
        # when parsing back to yaml, it weirdly adds an extra linebreak at the end
        self.assertEqual('bar: something\nfoo: 1\n', testjob.show_definition)

    @patch("squad.ci.tasks.submit.delay")
    def test_schedules_submission(self, submit):
        args = {
            'backend': 'lava',
            'definition': 'foo: 1',
        }
        r = self.submitter_client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(403, r.status_code)
        self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        job_id = models.TestJob.objects.last().id
        submit.assert_called_with(job_id)

    @patch("squad.ci.tasks.fetch.apply_async")
    def test_auth_on_watch_testjob(self, fetch):
        testjob_id = 1234
        args = {
            'backend': 'lava',
            'testjob_id': testjob_id,
        }
        self.client.token = 'invalid-token'
        r = self.client.post('/api/watchjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(403, r.status_code)

    @patch("squad.ci.tasks.fetch.apply_async")
    def test_watch_testjob(self, fetch):
        testjob_id = 1234
        args = {
            'backend': 'lava',
            'testjob_id': testjob_id,
        }
        r = self.client.post('/api/watchjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(201, r.status_code)
        testjob_queryset = models.TestJob.objects.filter(
            target=self.project,
            environment='myenv',
            target_build=self.build,
            backend=self.backend,
            submitted=True,
            job_id=testjob_id
        )
        self.assertEqual(
            1,
            testjob_queryset.count()
        )
        logentry_queryset = LogEntry.objects.filter(
            user_id=self.project_privileged_user.pk,
            object_id=testjob_queryset.last().pk
        )
        self.assertEqual(
            1,
            logentry_queryset.count()
        )
        self.assertEqual(
            ADDITION,
            logentry_queryset.last().action_flag
        )

    @patch("squad.ci.tasks.fetch.apply_async")
    def test_watch_testjob_private_group(self, fetch):
        testjob_id = 1234
        args = {
            'backend': 'lava',
            'testjob_id': testjob_id,
        }
        r = self.memberclient.post('/api/watchjob/~project-member-user/userproject/1/myenv', args)
        self.assertEqual(201, r.status_code)
        testjob_queryset = models.TestJob.objects.filter(
            target=self.userproject,
            environment='myenv',
            target_build=self.userbuild,
            backend=self.backend,
            submitted=True,
            job_id=testjob_id
        )
        self.assertEqual(
            1,
            testjob_queryset.count()
        )
        logentry_queryset = LogEntry.objects.filter(
            user_id=self.project_member_user.pk,
            object_id=testjob_queryset.last().pk
        )
        self.assertEqual(
            1,
            logentry_queryset.count()
        )
        self.assertEqual(
            ADDITION,
            logentry_queryset.last().action_flag
        )

    @patch("squad.ci.tasks.fetch.apply_async")
    def test_watch_testjob_mising_id(self, fetch):
        args = {
            'backend': 'lava'
        }
        r = self.client.post('/api/watchjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(400, r.status_code)

    @patch('squad.ci.models.Backend.get_implementation')
    def test_resubmit_submitter(self, get_implementation):
        impl = MagicMock()
        impl.resubmit = MagicMock()
        get_implementation.return_value = impl

        t = self.backend.test_jobs.create(
            target=self.project,
            can_resubmit=True
        )
        r = self.client.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(201, r.status_code)
        impl.resubmit.assert_called()
        t.refresh_from_db()
        self.assertEqual(False, t.can_resubmit)

    @patch('squad.ci.models.Backend.get_implementation')
    def test_resubmit_submitter_cant_resubmit(self, get_implementation):
        impl = MagicMock()
        impl.resubmit = MagicMock()
        get_implementation.return_value = impl

        t = self.backend.test_jobs.create(
            target=self.project,
            can_resubmit=False
        )
        r = self.client.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(403, r.status_code)
        impl.resubmit.assert_not_called()
        t.refresh_from_db()
        self.assertEqual(False, t.can_resubmit)

    @patch('squad.ci.models.Backend.get_implementation')
    def test_resubmit_submitter_token_auth(self, get_implementation):
        impl = MagicMock()
        impl.resubmit = MagicMock()
        get_implementation.return_value = impl

        t = self.backend.test_jobs.create(
            target=self.project,
            can_resubmit=True
        )

        r = self.restclient.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(201, r.status_code)
        impl.resubmit.assert_called()
        t.refresh_from_db()
        self.assertEqual(False, t.can_resubmit)

    @patch('squad.ci.models.Backend.get_implementation')
    def test_resubmit_submitter_auth_token_cant_resubmit(self, get_implementation):
        impl = MagicMock()
        impl.resubmit = MagicMock()
        get_implementation.return_value = impl

        t = self.backend.test_jobs.create(
            target=self.project,
            can_resubmit=False
        )

        r = self.restclient.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(403, r.status_code)
        impl.resubmit.assert_not_called()
        t.refresh_from_db()
        self.assertEqual(False, t.can_resubmit)

    @patch('squad.ci.models.Backend.get_implementation')
    def test_force_resubmit_submitter_token_auth(self, get_implementation):
        impl = MagicMock()
        impl.resubmit = MagicMock()
        get_implementation.return_value = impl

        t = self.backend.test_jobs.create(
            target=self.project,
            can_resubmit=True
        )

        r = self.restclient.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(201, r.status_code)
        impl.resubmit.assert_called()
        t.refresh_from_db()
        self.assertEqual(False, t.can_resubmit)

    @patch('squad.ci.models.Backend.get_implementation')
    def test_resubmit_admin(self, get_implementation):
        impl = MagicMock()
        impl.resubmit = MagicMock()
        get_implementation.return_value = impl

        t = self.backend.test_jobs.create(
            target=self.project,
            can_resubmit=True
        )
        r = self.adminclient.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(201, r.status_code)
        impl.resubmit.assert_called()
        t.refresh_from_db()
        self.assertEqual(False, t.can_resubmit)

    def test_disallowed_resubmit(self):
        t = self.backend.test_jobs.create(
            target=self.project,
            can_resubmit=True
        )
        r = self.memberclient.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(401, r.status_code)

    def test_resubmit_invalid_id(self):
        staff_user_password = "******"
        staff_user = User.objects.create_superuser(
            username="******",
            email="*****@*****.**",
            password=staff_user_password,
            is_staff=True)
        staff_user.save()
        client = Client()
        client.login(username=staff_user.username, password=staff_user_password)

        r = client.post('/api/resubmit/999')
        self.assertEqual(404, r.status_code)

    @patch('squad.ci.models.TestJob.resubmit', side_effect=SubmissionIssue('BOOM'))
    def test_resubmit_error(self, resubmit):
        t = self.backend.test_jobs.create(
            target=self.project,
            can_resubmit=True
        )
        r = self.adminclient.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(500, r.status_code)
        self.assertEqual('BOOM', r.content.decode())
Ejemplo n.º 10
0
class CiApiTest(TestCase):

    def setUp(self):
        self.group = core_models.Group.objects.create(slug='mygroup')
        self.project = self.group.projects.create(slug='myproject')

        self.project_submission_user = User.objects.create(username='******')
        usergroup = self.group.user_groups.create()
        self.project_submission_user.groups.add(usergroup)
        Token.objects.create(user=self.project_submission_user, key='thekey')

        self.backend = models.Backend.objects.create(name='lava')
        self.client = APIClient('thekey')

    def test_auth(self):
        args = {
            'backend': 'lava',
            'definition': 'foo: 1',
        }
        self.client.token = 'invalid-token'
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(401, r.status_code)

    def test_creates_test_run(self):
        args = {
            'backend': 'lava',
            'definition': 'foo: 1',
        }
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(201, r.status_code)
        self.assertEqual(
            1,
            models.TestJob.objects.filter(
                target=self.project,
                environment='myenv',
                build='1',
                backend=self.backend,
                definition='foo: 1',
            ).count()
        )

    def test_invalid_backend_test_run(self):
        args = {
            'backend': 'lava.foo',
            'definition': 'foo: 1',
        }
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(400, r.status_code)

    def test_missing_definition_test_run(self):
        args = {
            'backend': 'lava'
        }
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(400, r.status_code)

    def test_accepts_definition_as_file_upload(self):
        args = {
            'backend': 'lava',
            'definition': open(job_definition_file)
        }
        self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)

    @patch("squad.ci.tasks.submit.delay")
    def test_schedules_submission(self, submit):
        args = {
            'backend': 'lava',
            'definition': 'foo: 1',
        }
        self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        job_id = models.TestJob.objects.last().id
        submit.assert_called_with(job_id)

    @patch("squad.ci.tasks.fetch.delay")
    def test_auth_on_watch_testjob(self, fetch):
        testjob_id = 1234
        args = {
            'backend': 'lava',
            'testjob_id': testjob_id,
        }
        self.client.token = 'invalid-token'
        r = self.client.post('/api/watchjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(401, r.status_code)

    @patch("squad.ci.tasks.fetch.delay")
    def test_watch_testjob(self, fetch):
        testjob_id = 1234
        args = {
            'backend': 'lava',
            'testjob_id': testjob_id,
        }
        r = self.client.post('/api/watchjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(201, r.status_code)
        self.assertEqual(
            1,
            models.TestJob.objects.filter(
                target=self.project,
                environment='myenv',
                build='1',
                backend=self.backend,
                submitted=True,
                job_id=testjob_id
            ).count()
        )

    @patch("squad.ci.tasks.fetch.delay")
    def test_watch_testjob_mising_id(self, fetch):
        args = {
            'backend': 'lava'
        }
        r = self.client.post('/api/watchjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(400, r.status_code)

    @patch('squad.ci.models.Backend.get_implementation')
    def test_resubmit(self, get_implementation):
        impl = MagicMock()
        impl.resubmit = MagicMock()
        get_implementation.return_value = impl

        t = self.backend.test_jobs.create(
            target=self.project,
            can_resubmit=True
        )
        staff_user_password = "******"
        staff_user = User.objects.create_superuser(
            username="******",
            email="*****@*****.**",
            password=staff_user_password,
            is_staff=True)
        staff_user.save()
        client = Client()
        client.login(username=staff_user.username, password=staff_user_password)
        r = client.get('/api/resubmit/%s' % t.pk)
        self.assertEqual(201, r.status_code)
        impl.resubmit.assert_called()
        t.refresh_from_db()
        self.assertEqual(False, t.can_resubmit)

    def test_disallowed_resubmit(self):
        t = self.backend.test_jobs.create(
            target=self.project,
            can_resubmit=True
        )
        r = self.client.get('/api/resubmit/%s' % t.pk)
        self.assertEqual(401, r.status_code)

    def test_resubmit_invalid_id(self):
        staff_user_password = "******"
        staff_user = User.objects.create_superuser(
            username="******",
            email="*****@*****.**",
            password=staff_user_password,
            is_staff=True)
        staff_user.save()
        client = Client()
        client.login(username=staff_user.username, password=staff_user_password)

        r = client.get('/api/resubmit/999')
        self.assertEqual(400, r.status_code)
Ejemplo n.º 11
0
class CiApiTest(TestCase):

    def setUp(self):
        self.group = core_models.Group.objects.create(slug='mygroup')
        self.project = self.group.projects.create(slug='myproject')

        self.project_submission_user = User.objects.create(username='******')
        self.group.add_admin(self.project_submission_user)
        self.build = self.project.builds.create(version='1')
        Token.objects.create(user=self.project_submission_user, key='thekey')

        self.backend = models.Backend.objects.create(name='lava')
        self.client = APIClient('thekey')

    def test_auth(self):
        args = {
            'backend': 'lava',
            'definition': 'foo: 1',
        }
        self.client.token = 'invalid-token'
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(403, r.status_code)

    def test_creates_test_run(self):
        args = {
            'backend': 'lava',
            'definition': 'foo: 1',
        }
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(201, r.status_code)
        self.assertEqual(
            1,
            models.TestJob.objects.filter(
                target=self.project,
                environment='myenv',
                target_build=self.build,
                backend=self.backend,
                definition='foo: 1',
            ).count()
        )

    def test_invalid_backend_test_run(self):
        args = {
            'backend': 'lava.foo',
            'definition': 'foo: 1',
        }
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(400, r.status_code)

    def test_missing_definition_test_run(self):
        args = {
            'backend': 'lava'
        }
        r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(400, r.status_code)

    def test_accepts_definition_as_file_upload(self):
        args = {
            'backend': 'lava',
            'definition': open(job_definition_file)
        }
        self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)

    @patch("squad.ci.tasks.submit.delay")
    def test_schedules_submission(self, submit):
        args = {
            'backend': 'lava',
            'definition': 'foo: 1',
        }
        self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
        job_id = models.TestJob.objects.last().id
        submit.assert_called_with(job_id)

    @patch("squad.ci.tasks.fetch.delay")
    def test_auth_on_watch_testjob(self, fetch):
        testjob_id = 1234
        args = {
            'backend': 'lava',
            'testjob_id': testjob_id,
        }
        self.client.token = 'invalid-token'
        r = self.client.post('/api/watchjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(403, r.status_code)

    @patch("squad.ci.tasks.fetch.delay")
    def test_watch_testjob(self, fetch):
        testjob_id = 1234
        args = {
            'backend': 'lava',
            'testjob_id': testjob_id,
        }
        r = self.client.post('/api/watchjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(201, r.status_code)
        self.assertEqual(
            1,
            models.TestJob.objects.filter(
                target=self.project,
                environment='myenv',
                target_build=self.build,
                backend=self.backend,
                submitted=True,
                job_id=testjob_id
            ).count()
        )

    @patch("squad.ci.tasks.fetch.delay")
    def test_watch_testjob_mising_id(self, fetch):
        args = {
            'backend': 'lava'
        }
        r = self.client.post('/api/watchjob/mygroup/myproject/1/myenv', args)
        self.assertEqual(400, r.status_code)

    @patch('squad.ci.models.Backend.get_implementation')
    def test_resubmit(self, get_implementation):
        impl = MagicMock()
        impl.resubmit = MagicMock()
        get_implementation.return_value = impl

        t = self.backend.test_jobs.create(
            target=self.project,
            can_resubmit=True
        )
        staff_user_password = "******"
        staff_user = User.objects.create_superuser(
            username="******",
            email="*****@*****.**",
            password=staff_user_password,
            is_staff=True)
        staff_user.save()
        client = Client()
        client.login(username=staff_user.username, password=staff_user_password)
        r = client.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(201, r.status_code)
        impl.resubmit.assert_called()
        t.refresh_from_db()
        self.assertEqual(False, t.can_resubmit)

    def test_disallowed_resubmit(self):
        t = self.backend.test_jobs.create(
            target=self.project,
            can_resubmit=True
        )
        r = self.client.post('/api/resubmit/%s' % t.pk)
        self.assertEqual(401, r.status_code)

    def test_resubmit_invalid_id(self):
        staff_user_password = "******"
        staff_user = User.objects.create_superuser(
            username="******",
            email="*****@*****.**",
            password=staff_user_password,
            is_staff=True)
        staff_user.save()
        client = Client()
        client.login(username=staff_user.username, password=staff_user_password)

        r = client.post('/api/resubmit/999')
        self.assertEqual(404, r.status_code)