def test_initialization(self): """Test initialization for GitLab server""" setup_http_server(GITLAB_URL_PROJECT, GITLAB_ISSUES_URL, rate_limit_headers={'RateLimit-Remaining': '20'}) client = GitLabClient("fdroid", "fdroiddata", "your-token") self.assertEqual(client.owner, "fdroid") self.assertEqual(client.repository, "fdroiddata") self.assertEqual(client.token, "your-token") self.assertEqual(client.sleep_for_rate, False) self.assertEqual(client.base_url, GITLAB_API_URL) self.assertEqual(client.min_rate_to_sleep, GitLabClient.MIN_RATE_LIMIT) self.assertEqual(client.sleep_time, GitLabClient.DEFAULT_SLEEP_TIME) self.assertEqual(client.max_retries, GitLabClient.MAX_RETRIES) self.assertEqual(client.rate_limit, 20) self.assertEqual(client.rate_limit_reset_ts, None) client = GitLabClient("fdroid", "fdroiddata", "your-token", sleep_for_rate=True, min_rate_to_sleep=100, max_retries=10, sleep_time=100) self.assertEqual(client.sleep_for_rate, True) self.assertEqual(client.base_url, GITLAB_API_URL) self.assertEqual(client.min_rate_to_sleep, 100) self.assertEqual(client.sleep_time, 100) self.assertEqual(client.max_retries, 10)
def test_issues_from_date(self): """Test issues API call with from date parameter""" setup_http_server(GITLAB_URL_PROJECT, GITLAB_ISSUES_URL, rate_limit_headers={'RateLimit-Remaining': '20'}) page_1 = read_file('data/gitlab/issue_page_1') page_2 = read_file('data/gitlab/issue_page_2') from_date = datetime.datetime(2017, 1, 1) client = GitLabClient("fdroid", "fdroiddata", "your-token") raw_issues = [issues for issues in client.issues(from_date)] self.assertEqual(len(raw_issues), 2) self.assertNotEqual(raw_issues[0], json.dumps(json.loads(page_1))) self.assertEqual(raw_issues[1], json.dumps(json.loads(page_2))) # Check requests expected = { 'state': ['all'], 'sort': ['asc'], 'order_by': ['updated_at'], 'page': ['2'] } self.assertDictEqual(httpretty.last_request().querystring, expected) self.assertEqual(httpretty.last_request().headers["PRIVATE-TOKEN"], "your-token")
def test_note_emojis(self): """Test note_emojis API call""" setup_http_server(GITLAB_URL_PROJECT, GITLAB_ISSUES_URL, rate_limit_headers={'RateLimit-Remaining': '20'}) client = GitLabClient("fdroid", "fdroiddata", "your-token") raw_emojis = next(client.note_emojis(1, 2)) emojis = json.loads(raw_emojis) self.assertEqual(len(emojis), 0)
def test_calculate_time_to_reset(self): """Test whether the time to reset is zero if the sleep time is negative""" httpretty.register_uri(httpretty.GET, GITLAB_URL_PROJECT, body='', status=200, forcing_headers={ 'RateLimit-Remaining': '20', 'RateLimit-Reset': int(datetime_utcnow().replace(microsecond=0).timestamp()) }) client = GitLabClient("fdroid", "fdroiddata", "your-token") time_to_reset = client.calculate_time_to_reset() self.assertEqual(time_to_reset, 0)
def test_issues_empty(self): """Test when issue is empty API call""" httpretty.register_uri(httpretty.GET, GITLAB_URL_PROJECT, body='', status=200) httpretty.register_uri(httpretty.GET, GITLAB_ISSUES_URL, body="[]", status=200) client = GitLabClient("fdroid", "fdroiddata", "aaa") raw_issues = [issues for issues in client.issues()] self.assertEqual(raw_issues[0], "[]") self.assertEqual(httpretty.last_request().headers["PRIVATE-TOKEN"], "aaa")
def test_sanitize_for_archive(self): """Test whether the sanitize method works properly""" url = "http://example.com" headers = {'PRIVATE-TOKEN': 'ABCDEF'} payload = {} s_url, s_headers, s_payload = GitLabClient.sanitize_for_archive(url, copy.deepcopy(headers), payload) headers.pop('PRIVATE-TOKEN') self.assertEqual(url, s_url) self.assertEqual(headers, s_headers) self.assertEqual(payload, s_payload)
def test_http_wrong_status(self): """Test if a error is raised when the http status was not 200""" httpretty.register_uri(httpretty.GET, GITLAB_URL_PROJECT, body='', status=200, forcing_headers={ 'RateLimit-Remaining': '20', 'RateLimit-Reset': '15' }) httpretty.register_uri(httpretty.GET, GITLAB_ISSUES_URL, body="", status=500 ) client = GitLabClient("fdroid", "fdroiddata", "your-token", sleep_time=1) with self.assertRaises(requests.exceptions.HTTPError): _ = [issues for issues in client.issues()]
def test_sleep_for_rate(self): """Test whether a RateLimit error is thrown when the sleep for rate parameter is false""" wait = 2 reset = int(time.time() + wait) httpretty.register_uri(httpretty.GET, GITLAB_URL_PROJECT, body='', status=200, forcing_headers={ 'RateLimit-Remaining': '20', 'RateLimit-Reset': reset }) httpretty.register_uri( httpretty.GET, GITLAB_ISSUES_URL, body='[]', status=200, forcing_headers={ 'RateLimit-Remaining': '0', 'RateLimit-Reset': reset, 'Link': '<' + GITLAB_ISSUES_URL + '/?&page=2>; rel="next", <' + GITLAB_ISSUES_URL + '/?&page=3>; rel="last"' }) httpretty.register_uri(httpretty.GET, GITLAB_ISSUES_URL + '/?&page=2', body='[]', status=200, forcing_headers={ 'X-RateLimit-Remaining': '20', 'X-RateLimit-Reset': reset }) client = GitLabClient("fdroid", "fdroiddata", "your-token", sleep_for_rate=True) issues = [issues for issues in client.issues()] after = int(time.time()) self.assertTrue(reset >= after) self.assertEqual(len(issues), 2) client = GitLabClient("fdroid", "fdroiddata", "your-token") with self.assertRaises(RateLimitError): _ = [issues for issues in client.issues()]
def test_initialization_entreprise(self): """Test initialization for GitLab entreprise server""" setup_http_server(GITLAB_ENTERPRISE_URL_PROJECT, GITLAB_ENTERPRISE_ISSUES_URL) client = GitLabClient("am", "test", None, base_url=GITLAB_ENTERPRISE_URL) self.assertEqual(client.owner, "am") self.assertEqual(client.repository, "test") self.assertEqual(client.token, None) self.assertEqual(client.sleep_for_rate, False) self.assertEqual(client.base_url, GITLAB_ENTERPRISE_API_URL) self.assertEqual(client.min_rate_to_sleep, GitLabClient.MIN_RATE_LIMIT) self.assertEqual(client.sleep_time, GitLabClient.DEFAULT_SLEEP_TIME) self.assertEqual(client.max_retries, GitLabClient.MAX_RETRIES) self.assertEqual(client.rate_limit, None) self.assertEqual(client.rate_limit_reset_ts, None)