Beispiel #1
0
 def fake_update():
     # this simulates the effect of calling update() on a repo,
     # mainly that `export` and `log` now works.
     fake_vcs.log.side_effect = log_results
     fake_vcs.export.side_effect = None
     fake_vcs.export.return_value = SAMPLE_DIFF_BYTES
     fake_vcs.get_changed_files.side_effect = lambda id: Vcs.get_changed_files(fake_vcs, id)
    def test_invalid_config(self, mock_identify_revision, mock_get_vcs):
        repo = self.create_repo()
        revision = self.create_revision(repository=repo)
        project = self.create_project(repository=repo)
        project2 = self.create_project(repository=repo)
        self.create_plan(project)
        self.create_plan(project2)

        mock_vcs = self.get_fake_vcs()
        mock_vcs.export.side_effect = None
        mock_vcs.export.return_value = SAMPLE_DIFF
        mock_vcs.get_changed_files.side_effect = lambda id: Vcs.get_changed_files(
            mock_vcs, id)
        mock_vcs.update.side_effect = None
        mock_identify_revision.return_value = revision
        mock_vcs.read_file.side_effect = ('{{invalid yaml}}',
                                          yaml.safe_dump({
                                              'build.file-blacklist':
                                              ['ci/not-real'],
                                          }))
        mock_get_vcs.return_value = mock_vcs

        revision_created_handler(revision_sha=revision.sha,
                                 repository_id=repo.id)

        mock_vcs.export.assert_called_once_with(revision.sha)

        assert len(list(Build.query)) == 2
Beispiel #3
0
    def test_file_whitelist(self, mock_identify_revision, mock_get_vcs):
        repo = self.create_repo()
        revision = self.create_revision(repository=repo)
        project = self.create_project(repository=repo)
        self.create_plan(project)

        option = ProjectOption(project=project, name='build.file-whitelist', value='foo.txt')

        mock_vcs = self.get_fake_vcs()
        mock_vcs.export.side_effect = None
        mock_vcs.export.return_value = SAMPLE_DIFF
        mock_vcs.get_changed_files.side_effect = lambda id: Vcs.get_changed_files(mock_vcs, id)
        mock_vcs.update.side_effect = None
        mock_identify_revision.return_value = revision
        mock_get_vcs.return_value = mock_vcs

        db.session.add(option)
        db.session.flush()

        revision_created_handler(revision_sha=revision.sha, repository_id=repo.id)

        mock_vcs.export.assert_called_once_with(revision.sha)

        assert not Build.query.first()

        option.value = 'ci/*'
        db.session.add(option)
        db.session.flush()

        revision_created_handler(revision_sha=revision.sha, repository_id=repo.id)

        mock_identify_revision.assert_called_once_with(repo, revision.sha)

        assert Build.query.first()
Beispiel #4
0
    def test_file_blacklist(self, mock_identify_revision, mock_get_vcs):
        repo = self.create_repo()
        revision = self.create_revision(repository=repo)
        project = self.create_project(repository=repo)
        self.create_plan(project)

        mock_vcs = self.get_fake_vcs()
        mock_vcs.export.side_effect = None
        mock_vcs.export.return_value = SAMPLE_DIFF
        mock_vcs.get_changed_files.side_effect = lambda id: Vcs.get_changed_files(mock_vcs, id)
        mock_vcs.update.side_effect = None
        mock_identify_revision.return_value = revision
        mock_vcs.read_file.side_effect = None
        mock_vcs.read_file.return_value = yaml.safe_dump({
            'build.file-blacklist': ['ci/*'],
        })
        mock_get_vcs.return_value = mock_vcs

        revision_created_handler(revision_sha=revision.sha, repository_id=repo.id)

        mock_vcs.export.assert_called_once_with(revision.sha)

        assert not Build.query.first()

        mock_vcs.read_file.return_value = yaml.safe_dump({
            'build.file-blacklist': ['ci/not-real'],
        })

        revision_created_handler(revision_sha=revision.sha, repository_id=repo.id)

        mock_identify_revision.assert_called_once_with(repo, revision.sha)

        assert Build.query.first()
Beispiel #5
0
 def fake_update():
     # this simulates the effect of calling update() on a repo,
     # mainly that `export` and `log` now works.
     fake_vcs.log.side_effect = log_results
     fake_vcs.export.side_effect = None
     fake_vcs.export.return_value = SAMPLE_DIFF_BYTES
     fake_vcs.get_changed_files.side_effect = lambda id: Vcs.get_changed_files(fake_vcs, id)
    def test_file_whitelist(self, mock_identify_revision, mock_get_vcs):
        repo = self.create_repo()
        revision = self.create_revision(repository=repo)
        project = self.create_project(repository=repo)
        self.create_plan(project)

        option = ProjectOption(project=project,
                               name='build.file-whitelist',
                               value='foo.txt')

        mock_vcs = self.get_fake_vcs()
        mock_vcs.export.side_effect = None
        mock_vcs.export.return_value = SAMPLE_DIFF
        mock_vcs.get_changed_files.side_effect = lambda id: Vcs.get_changed_files(
            mock_vcs, id)
        mock_vcs.update.side_effect = None
        mock_identify_revision.return_value = revision
        mock_get_vcs.return_value = mock_vcs

        db.session.add(option)
        db.session.flush()

        revision_created_handler(revision_sha=revision.sha,
                                 repository_id=repo.id)

        mock_vcs.export.assert_called_once_with(revision.sha)

        assert not Build.query.first()

        option.value = 'ci/*'
        db.session.add(option)
        db.session.flush()

        revision_created_handler(revision_sha=revision.sha,
                                 repository_id=repo.id)

        mock_identify_revision.assert_called_once_with(repo, revision.sha)

        assert Build.query.first()
    def test_get_changed_files_updates_vcs(self):
        repo = self.create_repo()
        sha = uuid4().hex
        revision = self.create_revision(repository=repo, sha=sha)

        # No updated needed.
        with patch.object(repo, 'get_vcs') as get_vcs:
            mock_vcs = self.get_fake_vcs()
            mock_vcs.export.side_effect = None
            mock_vcs.export.return_value = SAMPLE_DIFF
            mock_vcs.get_changed_files.side_effect = lambda id: Vcs.get_changed_files(
                mock_vcs, id)
            mock_vcs.update.side_effect = None
            get_vcs.return_value = mock_vcs
            ct = CommitTrigger(revision)
            ct.get_changed_files()
            self.assertEqual(list(mock_vcs.method_calls), [
                ('exists', (), {}),
                ('get_changed_files', (sha, ), {}),
                ('export', (sha, ), {}),
            ])

        # Successful update
        with patch.object(repo, 'get_vcs') as get_vcs:
            mock_vcs = self.get_fake_vcs()
            # Raise first time, work second time.
            mock_vcs.export.side_effect = (UnknownRevision("", 1), SAMPLE_DIFF)
            mock_vcs.get_changed_files.side_effect = lambda id: Vcs.get_changed_files(
                mock_vcs, id)
            mock_vcs.update.side_effect = None
            get_vcs.return_value = mock_vcs
            ct = CommitTrigger(revision)
            ct.get_changed_files()
            self.assertEqual(list(mock_vcs.method_calls), [
                ('exists', (), {}),
                ('get_changed_files', (sha, ), {}),
                ('export', (sha, ), {}),
                ('update', (), {}),
                ('get_changed_files', (sha, ), {}),
                ('export', (sha, ), {}),
            ])

        # Unsuccessful update
        with patch.object(repo, 'get_vcs') as get_vcs:
            mock_vcs = self.get_fake_vcs()
            mock_vcs.exists.return_value = True
            # Revision is always unknown.
            mock_vcs.export.side_effect = UnknownRevision("", 1)
            mock_vcs.get_changed_files.side_effect = lambda id: Vcs.get_changed_files(
                mock_vcs, id)
            mock_vcs.update.side_effect = None
            get_vcs.return_value = mock_vcs

            ct = CommitTrigger(revision)
            with self.assertRaises(UnknownRevision):
                ct.get_changed_files()
            self.assertEqual(list(mock_vcs.method_calls), [
                ('exists', (), {}),
                ('get_changed_files', (sha, ), {}),
                ('export', (sha, ), {}),
                ('update', (), {}),
                ('get_changed_files', (sha, ), {}),
                ('export', (sha, ), {}),
            ])
Beispiel #8
0
    def test_get_changed_files_updates_vcs(self):
        repo = self.create_repo()
        sha = uuid4().hex
        revision = self.create_revision(repository=repo, sha=sha)

        # No updated needed.
        with patch.object(repo, 'get_vcs') as get_vcs:
            mock_vcs = self.get_fake_vcs()
            mock_vcs.export.side_effect = None
            mock_vcs.export.return_value = SAMPLE_DIFF
            mock_vcs.get_changed_files.side_effect = lambda id: Vcs.get_changed_files(mock_vcs, id)
            mock_vcs.update.side_effect = None
            get_vcs.return_value = mock_vcs
            ct = CommitTrigger(revision)
            ct.get_changed_files()
            self.assertEqual(list(mock_vcs.method_calls), [
                ('exists', (), {}),
                ('get_changed_files', (sha,), {}),
                ('export', (sha,), {}),
                ])

        # Successful update
        with patch.object(repo, 'get_vcs') as get_vcs:
            mock_vcs = self.get_fake_vcs()
            # Raise first time, work second time.
            mock_vcs.export.side_effect = (UnknownRevision("", 1), SAMPLE_DIFF)
            mock_vcs.get_changed_files.side_effect = lambda id: Vcs.get_changed_files(mock_vcs, id)
            mock_vcs.update.side_effect = None
            get_vcs.return_value = mock_vcs
            ct = CommitTrigger(revision)
            ct.get_changed_files()
            self.assertEqual(list(mock_vcs.method_calls), [
                ('exists', (), {}),
                ('get_changed_files', (sha,), {}),
                ('export', (sha,), {}),
                ('update', (), {}),
                ('get_changed_files', (sha,), {}),
                ('export', (sha,), {}),
                ])

        # Unsuccessful update
        with patch.object(repo, 'get_vcs') as get_vcs:
            mock_vcs = self.get_fake_vcs()
            mock_vcs.exists.return_value = True
            # Revision is always unknown.
            mock_vcs.export.side_effect = UnknownRevision("", 1)
            mock_vcs.get_changed_files.side_effect = lambda id: Vcs.get_changed_files(mock_vcs, id)
            mock_vcs.update.side_effect = None
            get_vcs.return_value = mock_vcs

            ct = CommitTrigger(revision)
            with self.assertRaises(UnknownRevision):
                ct.get_changed_files()
            self.assertEqual(list(mock_vcs.method_calls), [
                ('exists', (), {}),
                ('get_changed_files', (sha,), {}),
                ('export', (sha,), {}),
                ('update', (), {}),
                ('get_changed_files', (sha,), {}),
                ('export', (sha,), {}),
                ])