def test_resultset_sample_data(self): """Test all add methods for building result sets""" trsc = TreeherderResultSetCollection() for resultset in self.resultset_data: trs = TreeherderResultSet() trs.add_push_timestamp(resultset['push_timestamp']) trs.add_revision_hash(resultset['revision_hash']) trs.add_author(resultset['author']) trs.add_type('push') for revision in resultset['revisions']: tr = TreeherderRevision() tr.add_revision(revision['revision']) tr.add_author(revision['author']) tr.add_comment(revision['comment']) tr.add_repository(revision['repository']) trs.add_revision(tr) self.compare_structs(trs.data, resultset) trsc.add(trs) # confirm we get the same thing if we initialize from # a resultset dict trs_struct = TreeherderResultSet(resultset) self.compare_structs(trs_struct.data, resultset)
def test_resultset_create(sample_resultset, jm, initial_data): """ test posting data to the resultset endpoint via webtest. extected result are: - return code 200 - return message successful - 1 resultset stored in the jobs schema """ trsc = TreeherderResultSetCollection() for rs in sample_resultset: rs = trsc.get_resultset(rs) trsc.add(rs) resp = test_utils.post_collection(jm.project, trsc) assert resp.status_int == 200 assert resp.json['message'] == 'well-formed JSON stored' stored_objs = jm.get_jobs_dhub().execute( proc="jobs_test.selects.resultset_by_rev_hash", placeholders=[sample_resultset[0]['revision_hash']]) assert len(stored_objs) == 1 assert stored_objs[0]['revision_hash'] == sample_resultset[0][ 'revision_hash'] jm.disconnect()
def test_resultset_create(test_repository, sample_resultset, mock_post_json): """ test posting data to the resultset endpoint via webtest. extected result are: - return code 200 - return message successful - 1 resultset stored in the jobs schema """ assert Push.objects.count() == 0 # store the first two, so we submit all, but should properly not re- # add the others. store_result_set_data(test_repository, sample_resultset[:2]) assert Push.objects.count() == 2 trsc = TreeherderResultSetCollection() exp_revision_hashes = set() for rs in sample_resultset: rs.update({'author': 'John Doe'}) result_set = trsc.get_resultset(rs) trsc.add(result_set) exp_revision_hashes.add(rs["revision"]) test_utils.post_collection(test_repository.name, trsc) assert Push.objects.count() == len(sample_resultset) assert set(Push.objects.values_list('revision', flat=True)) == set( [rs['revision'] for rs in sample_resultset])
def test_resultset_create(sample_resultset, jm, initial_data, mock_post_json): """ test posting data to the resultset endpoint via webtest. extected result are: - return code 200 - return message successful - 1 resultset stored in the jobs schema """ trsc = TreeherderResultSetCollection() for rs in sample_resultset: rs.update({'author': 'John Doe'}) result_set = trsc.get_resultset(rs) trsc.add(result_set) test_utils.post_collection(jm.project, trsc) stored_objs = jm.get_dhub().execute( proc="jobs_test.selects.resultset_by_rev_hash", placeholders=[sample_resultset[0]['revision_hash']] ) assert len(stored_objs) == 1 assert stored_objs[0]['revision_hash'] == sample_resultset[0]['revision_hash'] jm.disconnect()
def test_resultset_create(jm, test_repository, sample_resultset, mock_post_json): """ test posting data to the resultset endpoint via webtest. extected result are: - return code 200 - return message successful - 1 resultset stored in the jobs schema """ # store the first two, so we submit all, but should properly not re- # add the others. jm.store_result_set_data(sample_resultset[:2]) trsc = TreeherderResultSetCollection() exp_revision_hashes = set() for rs in sample_resultset: rs.update({'author': 'John Doe'}) result_set = trsc.get_resultset(rs) trsc.add(result_set) exp_revision_hashes.add(rs["revision"]) resp = test_utils.post_collection(jm.project, trsc) act_revision_hashes = {x["long_revision"] for x in resp.json["resultsets"]} assert exp_revision_hashes == act_revision_hashes stored_objs = jm.get_dhub().execute( proc="jobs_test.selects.resultset_by_long_revision", placeholders=[sample_resultset[0]['revision']]) assert len(stored_objs) == 1 assert stored_objs[0]['long_revision'] == sample_resultset[0]['revision']
def test_send_result_collection(self): """Can add a treeherder collections to a TreeherderRequest.""" trc = TreeherderResultSetCollection() for resultset in self.resultset_data: trc.add(trc.get_resultset(resultset)) client = TreeherderClient( server_url='http://host', client_id='client-abc', secret='secret123', ) def request_callback(request): # Check that the expected content was POSTed. posted_json = json.loads(request.body) self.assertEqual(posted_json, trc.get_collection_data()) return ( 200, {}, '{"message": "well-formed JSON stored", "resultsets": [123, 456]}' ) url = client._get_endpoint_url(trc.endpoint_base, project='project') responses.add_callback(responses.POST, url, match_querystring=True, callback=request_callback, content_type='application/json') client.post_collection('project', trc)
def test_resultset_collection(self): """Confirm the collection matches the sample data""" trc = TreeherderResultSetCollection() for resultset in self.resultset_data: trs = TreeherderResultSet(resultset) trc.add(trs) self.assertTrue(len(self.resultset_data) == len(trc.data))
def transform(self, pushlog, repository): # this contain the whole list of transformed pushes th_collections = {repository: TreeherderResultSetCollection()} # iterate over the pushes for push in pushlog.values(): if not push['changesets']: # If a pushlog contains hidden changesets (changesets that are # obsolete) then the call to json-pushes will return a push # with no changesets. This was changed in bug 1286426. # For us, if `changesets` is empty, we will not be able to get # a revision, which is required for a resultset. So we # need to just skip the push. continue result_set = dict() result_set['push_timestamp'] = push['date'] result_set['revisions'] = [] # Author of the push/resultset result_set['author'] = push['user'] result_set['active_status'] = push.get('active_status', 'active') # TODO: Remove this with Bug 1257602 is addressed rev_hash_components = [] # iterate over the revisions # we only want to ingest the last 200 revisions. for change in push['changesets'][-200:]: revision = { 'revision': change['node'], 'author': change['author'], 'branch': change['branch'], 'comment': change['desc'], 'repository': repository } rev_hash_components.append(change['node']) rev_hash_components.append(change['branch']) # append the revision to the push result_set['revisions'].append(revision) result_set['revision_hash'] = generate_revision_hash( rev_hash_components) result_set['revision'] = result_set["revisions"][-1]["revision"] th_resultset = th_collections[repository].get_resultset(result_set) th_collections[repository].add(th_resultset) return th_collections
def transform(self, pushlog, repository): # this contain the whole list of transformed pushes th_collections = {} # iterate over the pushes for push in pushlog.values(): result_set = dict() result_set['push_timestamp'] = push['date'] result_set['revisions'] = [] # Author of the push/resultset result_set['author'] = push['user'] result_set['active_status'] = push.get('active_status', 'active') rev_hash_components = [] # iterate over the revisions # we only want to ingest the last 200 revisions. for change in push['changesets'][-200:]: revision = dict() # we need to get the short version of a revision # because buildapi doesn't provide the long one # and we need to match it revision['revision'] = change['node'][0:12] revision['author'] = change['author'] revision['branch'] = change['branch'] revision['comment'] = change['desc'] revision['repository'] = repository rev_hash_components.append(change['node']) rev_hash_components.append(change['branch']) # append the revision to the push result_set['revisions'].append(revision) result_set['revision_hash'] = generate_revision_hash( rev_hash_components) if repository not in th_collections: th_collections[repository] = TreeherderResultSetCollection() th_resultset = th_collections[repository].get_resultset(result_set) th_collections[repository].add(th_resultset) return th_collections
def test_resultset_with_bad_key(sample_resultset, jm, initial_data): trsc = TreeherderResultSetCollection() for rs in sample_resultset: rs = trsc.get_resultset(rs) trsc.add(rs) resp = test_utils.post_collection(jm.project, trsc, status=403, consumer_key="horrible-key") assert resp.status_int == 403 assert resp.json[ 'detail'] == 'oauth_consumer_key does not match credentials for project {0}'.format( jm.project)
def test_resultset_with_bad_secret(sample_resultset, jm, initial_data): trsc = TreeherderResultSetCollection() for rs in sample_resultset: rs = trsc.get_resultset(rs) trsc.add(rs) resp = test_utils.post_collection(jm.project, trsc, status=403, consumer_secret="horrible secret") assert resp.status_int == 403 assert resp.json[ 'detail'] == "Client authentication failed for project {0}".format( jm.project)
def transform(self, pushlog, repository): # this contain the whole list of transformed pushes th_collections = {} # iterate over the pushes for push in pushlog.values(): result_set = dict() result_set['push_timestamp'] = push['date'] result_set['revisions'] = [] # Author of the push/resultset result_set['author'] = push['user'] result_set['active_status'] = push.get('active_status', 'active') # TODO: Remove this with Bug 1257602 is addressed rev_hash_components = [] # iterate over the revisions # we only want to ingest the last 200 revisions. for change in push['changesets'][-200:]: revision = dict() revision['revision'] = change['node'] revision['author'] = change['author'] revision['branch'] = change['branch'] revision['comment'] = change['desc'] revision['repository'] = repository rev_hash_components.append(change['node']) rev_hash_components.append(change['branch']) # append the revision to the push result_set['revisions'].append(revision) result_set['revision_hash'] = generate_revision_hash( rev_hash_components) result_set['revision'] = result_set["revisions"][-1]["revision"] if repository not in th_collections: th_collections[repository] = TreeherderResultSetCollection() th_resultset = th_collections[repository].get_resultset(result_set) th_collections[repository].add(th_resultset) return th_collections
def test_send_result_collection(self, mock_post): """Can add a treeherder collections to a TreeherderRequest.""" mock_post.return_value = self._expected_response_return_object() trc = TreeherderResultSetCollection() for resultset in self.resultset_data: trc.add(trc.get_resultset(resultset)) client = TreeherderClient( protocol='http', host='host', ) client.post_collection('project', 'key', 'secret', trc) path, resp = mock_post.call_args self.assertEqual(mock_post.call_count, 1) self.assertEqual(trc.to_json(), resp['data'])