def setup(self):
     self.mock_github = Mock(spec_set=Github)
     with patch('%s.__init__' % pb, Mock(return_value=None)):
         self.cls = GitHubWrapper()
         self.cls.github = self.mock_github
         self.cls.token = 'mytoken'
class TestGitHubWrapper(object):

    def setup(self):
        self.mock_github = Mock(spec_set=Github)
        with patch('%s.__init__' % pb, Mock(return_value=None)):
            self.cls = GitHubWrapper()
            self.cls.github = self.mock_github
            self.cls.token = 'mytoken'

    def test_find_projects(self):

        def se_404(fname):
            raise UnknownObjectException(404, 'some data')

        mock_repo1 = Mock(spec_set=Repository)
        type(mock_repo1).full_name = 'myuser/foo'
        mock_repo1.get_file_contents.return_value = True
        type(mock_repo1).clone_url = 'cloneurl'
        type(mock_repo1).ssh_url = 'sshurl'

        mock_repo2 = Mock(spec_set=Repository)
        type(mock_repo2).full_name = 'myuser/bar'

        mock_repo3 = Mock(spec_set=Repository)
        type(mock_repo3).full_name = 'myuser/baz'
        mock_repo3.get_file_contents.side_effect = se_404

        with patch('%s.get_repos' % pb) as mock_get_repos, \
                patch('%s.repo_commit_in_last_day' % pb) as mock_last_day, \
                patch('%s.logger' % pbm) as mock_logger:
            mock_get_repos.return_value = [
                mock_repo1, mock_repo2, mock_repo3
            ]
            mock_last_day.side_effect = [False, True, False]
            res = self.cls.find_projects()

        assert res == {
            'myuser/foo': ('cloneurl', 'sshurl')
        }
        assert mock_logger.mock_calls == [
            call.debug("Skipping repository '%s' - commit on master in "
                       "last day", 'myuser/bar'),
            call.debug("Skipping repository '%s' - .rebuildbot.sh not "
                       "present", 'myuser/baz'),
            call.debug("Found %d repos: %s", 1, ['myuser/foo'])
        ]

    def test_find_projects_no_date_check(self):

        def se_404(fname):
            raise UnknownObjectException(404, 'some data')

        mock_repo1 = Mock(spec_set=Repository)
        type(mock_repo1).full_name = 'myuser/foo'
        mock_repo1.get_file_contents.return_value = True
        type(mock_repo1).clone_url = 'cloneurl'
        type(mock_repo1).ssh_url = 'sshurl'

        mock_repo2 = Mock(spec_set=Repository)
        type(mock_repo2).full_name = 'myuser/bar'
        mock_repo2.get_file_contents.return_value = True
        type(mock_repo2).clone_url = 'cloneurl2'
        type(mock_repo2).ssh_url = 'sshurl2'

        mock_repo3 = Mock(spec_set=Repository)
        type(mock_repo3).full_name = 'myuser/baz'
        mock_repo3.get_file_contents.side_effect = se_404

        with patch('%s.get_repos' % pb) as mock_get_repos, \
                patch('%s.repo_commit_in_last_day' % pb) as mock_last_day, \
                patch('%s.logger' % pbm) as mock_logger:
            mock_get_repos.return_value = [
                mock_repo1, mock_repo2, mock_repo3
            ]
            mock_last_day.side_effect = [False, True, False]
            res = self.cls.find_projects(date_check=False)

        assert res == {
            'myuser/foo': ('cloneurl', 'sshurl'),
            'myuser/bar': ('cloneurl2', 'sshurl2'),
        }
        assert mock_logger.mock_calls == [
            call.debug("Skipping repository '%s' - .rebuildbot.sh not "
                       "present", 'myuser/baz'),
            call.debug("Found %d repos: %s", 2, ['myuser/bar', 'myuser/foo'])
        ]

    def test_get_project_config(self):
        mock_repo1 = Mock(spec_set=Repository)
        type(mock_repo1).full_name = 'myuser/foo'
        mock_repo1.get_file_contents.return_value = True
        type(mock_repo1).clone_url = 'cloneurl'
        type(mock_repo1).ssh_url = 'sshurl'

        self.cls.github.get_repo.return_value = mock_repo1
        res = self.cls.get_project_config('me/myrepo')
        assert res == ('cloneurl', 'sshurl')
        assert self.cls.github.mock_calls == [
            call.get_repo('me/myrepo'),
            call.get_repo().get_file_contents('.rebuildbot.sh', ref='master')
        ]
        assert mock_repo1.mock_calls == [
            call.get_file_contents('.rebuildbot.sh', ref='master')
        ]

    def test_get_project_config_404(self):

        def se_404(fname, ref='master'):
            raise UnknownObjectException(404, 'some data')

        mock_repo1 = Mock(spec_set=Repository)
        type(mock_repo1).full_name = 'myuser/foo'
        mock_repo1.get_file_contents.side_effect = se_404

        self.cls.github.get_repo.return_value = mock_repo1
        res = self.cls.get_project_config('me/myrepo')
        assert res == (None, None)
        assert self.cls.github.mock_calls == [
            call.get_repo('me/myrepo'),
            call.get_repo().get_file_contents('.rebuildbot.sh', ref='master')
        ]
        assert mock_repo1.mock_calls == [
            call.get_file_contents('.rebuildbot.sh', ref='master')
        ]

    def test_get_repos(self):
        mock_user = Mock(spec_set=AuthenticatedUser)
        type(mock_user).login = '******'

        mock_repo1 = Mock(spec_set=Repository)
        type(mock_repo1).full_name = 'myuser/foo'
        type(mock_repo1).owner = Mock(login='******')
        mock_repo2 = Mock(spec_set=Repository)
        type(mock_repo2).full_name = 'someorg/foo'
        type(mock_repo2).owner = Mock(login='******')
        mock_repo3 = Mock(spec_set=Repository)
        type(mock_repo3).full_name = 'myuser/bar'
        type(mock_repo3).owner = Mock(login='******')

        mock_user.get_repos.return_value = [mock_repo1, mock_repo2, mock_repo3]
        self.cls.github.get_user.return_value = mock_user

        res = self.cls.get_repos()
        assert res == [mock_repo1, mock_repo3]

    @freeze_time('2015-01-10 12:13:14')
    def test_repo_commit_in_last_day_false(self):
        mock_repo = Mock(spec_set=Repository)
        type(mock_repo).full_name = 'myuser/foo'
        type(mock_repo).owner = Mock(login='******')

        mock_author = Mock(spec_set=GitAuthor)
        type(mock_author).date = datetime.datetime(2015, 1, 1, 2, 3, 4)
        mock_commit_commit = Mock(spec_set=GitCommit)
        type(mock_commit_commit).author = mock_author
        mock_commit = Mock(spec_set=Commit)
        type(mock_commit).sha = 'myCommitSHA'
        type(mock_commit).commit = mock_commit_commit
        mock_branch = Mock(spec_set=Branch)
        type(mock_branch).commit = mock_commit
        mock_repo.get_branch.return_value = mock_branch

        res = self.cls.repo_commit_in_last_day(mock_repo)
        assert res is False
        assert mock_repo.mock_calls == [call.get_branch('master')]

    @freeze_time('2015-01-10 12:13:14')
    def test_repo_commit_in_last_day_true(self):
        mock_repo = Mock(spec_set=Repository)
        type(mock_repo).full_name = 'myuser/foo'
        type(mock_repo).owner = Mock(login='******')

        mock_author = Mock(spec_set=GitAuthor)
        type(mock_author).date = datetime.datetime(2015, 1, 10, 10, 1, 2)
        mock_commit_commit = Mock(spec_set=GitCommit)
        type(mock_commit_commit).author = mock_author
        mock_commit = Mock(spec_set=Commit)
        type(mock_commit).sha = 'myCommitSHA'
        type(mock_commit).commit = mock_commit_commit
        mock_branch = Mock(spec_set=Branch)
        type(mock_branch).commit = mock_commit
        mock_repo.get_branch.return_value = mock_branch

        res = self.cls.repo_commit_in_last_day(mock_repo)
        assert res is True
        assert mock_repo.mock_calls == [call.get_branch('master')]

    @freeze_time('2015-01-10 12:13:14')
    def test_repo_commit_in_last_day_exception(self):

        def se_exc(foo):
            raise GithubException("foo", "bar")

        mock_repo = Mock(spec_set=Repository)
        type(mock_repo).full_name = 'myuser/foo'
        type(mock_repo).owner = Mock(login='******')
        mock_repo.get_branch.side_effect = se_exc

        with patch('%s.logger' % pbm) as mock_logger:
            res = self.cls.repo_commit_in_last_day(mock_repo)
        assert res is True
        assert mock_repo.mock_calls == [call.get_branch('master')]
        assert mock_logger.mock_calls == [
            call.exception("Unable to get branch %s for repo %s",
                           'master', 'myuser/foo')
        ]