def test_headers_not_master_event(self, mock_g, mock_valid_sign,
                                      mock_request_get):
        """
        Test the view by sending a valid event.
        """
        mock_request_get.return_value.json.return_value = {
            "hooks": ['0.0.0.0']
        }
        self.app.config['INSTALL_FOLDER'] = gettempdir()
        data = {'ref': 'refs/heads/not_master'}
        sig = generate_signature(
            str(json.dumps(data)).encode('utf-8'), g.github['ci_key'])
        headers = generate_git_api_header('push', sig)

        with self.app.test_client() as client:
            response = client.post('/deploy',
                                   environ_overrides=WSGI_ENVIRONMENT,
                                   data=json.dumps(data),
                                   headers=headers)

        self.assertEqual(response.status_code, 200)
        self.assertIn('Not master', str(response.data))
        mock_valid_sign.assert_called_once()
        mock_g.log.warning.assert_not_called()
        mock_request_get.assert_called_once_with('https://api.github.com/meta')
    def generate_header(data, event):
        """
        Generate headers for various REST methods.

        :param data: payload for the event
        :type data: dict
        :param event: the GitHub event to be triggered
        :type event: str
        """
        sig = generate_signature(str(json.dumps(data)).encode('utf-8'), g.github['ci_key'])
        headers = generate_git_api_header(event, sig)
        return headers
    def test_headers_missing_User_Agent(self, mock_request_get):
        """Test missing User-Agent header."""
        mock_request_get.return_value.json.return_value = {
            "hooks": ['0.0.0.0']
        }
        sig = generate_signature(
            str(json.dumps({})).encode('utf-8'), g.github['ci_key'])
        headers = generate_git_api_header('push', sig)
        headers.remove('User-Agent')

        response = self.app.test_client().post(
            '/deploy', headers=headers, environ_overrides=WSGI_ENVIRONMENT)

        self.assertEqual(response.status_code, 418)
    def test_headers_ping(self, mock_request_get):
        """Test The View by sending a ping request."""
        mock_request_get.return_value.json.return_value = {
            "hooks": ['0.0.0.0']
        }
        sig = generate_signature(
            str(json.dumps({})).encode('utf-8'), g.github['ci_key'])
        headers = generate_git_api_header('ping', sig)

        response = self.app.test_client().post(
            '/deploy', headers=headers, environ_overrides=WSGI_ENVIRONMENT)

        self.assertEqual(response.status_code, 200)
        self.assertIn("Hi", str(response.data))
 def test_webhook_prerelease(self, mock_request):
     """
     Check webhook release update CCExtractor Version for prerelease.
     """
     with self.app.test_client() as c:
         # Full Release with version with 2.1
         data = {'action': 'prereleased',
                 'release': {'prerelease': True, 'published_at': '2018-05-30T20:18:44Z', 'tag_name': 'v2.1'}}
         sig = generate_signature(str(json.dumps(data)).encode('utf-8'), g.github['ci_key'])
         headers = generate_git_api_header('release', sig)
         last_commit = GeneralData.query.filter(GeneralData.key == 'last_commit').first()
         # abcdefgh is the new commit after previous version defined in base.py
         last_commit.value = 'abcdefgh'
         g.db.commit()
         response = c.post(
             '/start-ci', environ_overrides=WSGI_ENVIRONMENT,
             data=json.dumps(data), headers=self.generate_header(data, 'ping'))
         last_release = CCExtractorVersion.query.order_by(CCExtractorVersion.released.desc()).first()
         self.assertNotEqual(last_release.version, '2.1')
    def test_headers_valid_event(self, mock_open, mock_copy, mock_subprocess,
                                 mock_valid_sign, mock_repo, mock_request_get):
        """
        Test the view by sending a valid event.
        """
        mock_request_get.return_value.json.return_value = {
            "hooks": ['0.0.0.0']
        }
        self.app.config['INSTALL_FOLDER'] = gettempdir()
        data = {'ref': 'refs/heads/master'}
        sig = generate_signature(
            str(json.dumps(data)).encode('utf-8'), g.github['ci_key'])
        headers = generate_git_api_header('push', sig)

        # set return for mock_repo
        class mock_pull:
            from collections import namedtuple
            flags = 128
            commit_obj = namedtuple('commit_obj', ['hexsha'])
            commit = commit_obj('somesha')

        mock_repo.return_value.remote.return_value.fetch.return_value = "valid fetch"
        mock_repo.return_value.remote.return_value.pull.return_value = [
            mock_pull
        ]

        with self.app.test_client() as client:
            response = client.post('/deploy',
                                   environ_overrides=WSGI_ENVIRONMENT,
                                   data=json.dumps(data),
                                   headers=headers)
        self.assertEqual(response.status_code, 200)
        mock_repo.assert_called_once()
        mock_open.assert_called_once_with('build_commit.py', 'w')
        mock_copy.assert_called_once()
        mock_subprocess.assert_called_once_with(
            ["sudo", "service", "platform", "reload"])
        self.assertIn("somesha", response.data.decode('utf-8'))