def test_known_pull_request_task(app, owner, repository, session): """Task pull_request /pulls/1 that already exists.""" httpretty.reset() cs1 = CommitStatus(repository, "1", "https://github.com/pulls/1", { "message": [], "files": {} }) cs2 = CommitStatus(repository, "2", "https://github.com/pulls/2", { "message": [], "files": {} }) session.add(cs1) session.add(cs2) session.commit() bs = BranchStatus(cs2, "test:my-branch", "https://github.com/pulls/1", { "commits": [cs1, cs2], "files": {} }) session.add(bs) session.commit() assert_that(bs.is_pending(), equal_to(False)) httpretty.enable() pull_request(bs.id, "https://api.github.com/pulls/1", "http://kwalitee.invenio-software.org/status/2", {"ACCESS_TOKEN": "deadbeef"}) httpretty.disable() latest_requests = httpretty.HTTPretty.latest_requests assert_that(len(latest_requests), equal_to(0), "No requests are expected")
def test_known_pull_request_task(app, owner, repository, session): """Task pull_request /pulls/1 that already exists.""" httpretty.reset() cs1 = CommitStatus(repository, "1", "https://github.com/pulls/1", {"message": [], "files": {}}) cs2 = CommitStatus(repository, "2", "https://github.com/pulls/2", {"message": [], "files": {}}) session.add(cs1) session.add(cs2) session.commit() bs = BranchStatus(cs2, "test:my-branch", "https://github.com/pulls/1", {"commits": [cs1, cs2], "files": {}}) session.add(bs) session.commit() assert_that(bs.is_pending(), equal_to(False)) httpretty.enable() pull_request(bs.id, "https://api.github.com/pulls/1", "http://kwalitee.invenio-software.org/status/2", {"ACCESS_TOKEN": "deadbeef"}) httpretty.disable() latest_requests = httpretty.HTTPretty.latest_requests assert_that(len(latest_requests), equal_to(0), "No requests are expected")
def branch(owner, repository, commits, session, request): """Create a branch status for a test.""" branch_name = "test:wip/my-branch" bs = BranchStatus(commits[-1], branch_name, "https://github.com/pulls/1", {"commits": commits, "files": {}}) session.add(bs) session.commit() def teardown(): session.delete(bs) session.commit() request.addfinalizer(teardown) return bs
def branch(owner, repository, session, request): cs = [ { "sha": "ef01234" }, { "sha": "789abcd" }, { "sha": "0123456" }, ] name = "spam:wip/my-branch" url_template = "https://github.com/invenio/test/commits/{sha}" commits = [] branches = [] for commit in cs: cs = CommitStatus(repository, commit["sha"], url_template.format(**commit)) commits.append(cs) session.add(cs) session.commit() bs = BranchStatus(commits[-1], name, "http://github.com/pulls/1", { "commits": commits, "files": {} }) branches.append(bs) session.add(bs) session.commit() def teardown(): for bs in branches: session.delete(bs) session.commit() for commit in commits: session.delete(commit) session.commit() request.addfinalizer(teardown) return branches[-1]
def test_remove(session): """remove {account} drops everything tied to it""" add("invenio") acc = Account.query.filter_by(name="invenio").first() rep = Repository.find_or_create(acc, "foo") commit = CommitStatus(rep, "1", "http://") session.add(commit) session.commit() bs = BranchStatus(commit, "1", "http://") session.add(bs) session.commit() remove("invenio") assert_that(Account.query.filter_by(name="invenio").count(), equal_to(0)) assert_that(Repository.query.filter_by(name="foo").count(), equal_to(0)) assert_that( CommitStatus.query.filter_by(repository_id=rep.id).count(), equal_to(0)) assert_that( BranchStatus.query.filter_by(commit_id=commit.id).count(), equal_to(0))
def test_okay_pull_request_task(app, owner, repository, session): """Task pull_request /pulls/1 with pep8 errors""" httpretty.reset() pull = { "title": "Lorem ipsum", "url": "https://api.github.com/pulls/1", "html_url": "https://github.com/pulls/1", "commits_url": "https://api.github.com/pulls/1/commits", "statuses_url": "https://api.github.com/statuses/1", "issue_url": "https://api.github.com/issues/1", "review_comments_url": "https://api.github.com/pulls/1/comments", "head": { "sha": "1", "label": "test:my-branch" }, "base": { "repo": { "full_name": "kwalitee/test" }, "ref": "testref" }, } httpretty.register_uri(httpretty.GET, "https://api.github.com/pulls/1", body=json.dumps(pull), content_type="application/json") httpretty.register_uri(httpretty.GET, "https://api.github.com/repos/kwalitee/test/" "contents/.kwalitee.yml?ref=testref", status=404) issue = { "url": "https://apigithub.com/issues/1", "html_url": "https://github.com/issues/1", "labels_url": "https://api.github.com/issues/1/labels{/name}", "id": "42", "number": "1", "labels": [{ "name": "foo" }, { "name": "in_work" }], "state": "open" } httpretty.register_uri(httpretty.GET, "https://api.github.com/issues/1", body=json.dumps(issue), content_type="application/json") labels = [{ "url": "https://github.com/labels/foo", "name": "foo", "color": "000000" }, { "url": "https://github.com/labels/in_review", "name": "in_review", "color": "ff0000" }] httpretty.register_uri(httpretty.PUT, "https://api.github.com/issues/1/labels", status=200, body=json.dumps(labels), content_type="application/json") commits = [{ "url": "https://api.github.com/commits/1", "sha": "1", "html_url": "https://github.com/commits/1", "comments_url": "https://api.github.com/commits/1/comments", "commit": { "message": "herp: derp\r\n\r\nSigned-off-by: John Doe " "<*****@*****.**>" } }] httpretty.register_uri(httpretty.GET, "https://api.github.com/pulls/1/commits", body=json.dumps(commits), content_type="application/json") files = [{ "filename": "eggs/__init__.py", "status": "added", "raw_url": "https://github.com/raw/1/eggs/__init__.py", "contents_url": "https://api.github.com/eggs/__init__.py?ref=1" }] httpretty.register_uri(httpretty.GET, "https://api.github.com/pulls/1/files", body=json.dumps(files), content_type="application/json") init_py = GPL.format(datetime.now().year, '#') httpretty.register_uri(httpretty.GET, "https://github.com/raw/1/eggs/__init__.py", body=init_py, content_type="text/plain") httpretty.register_uri(httpretty.POST, "https://api.github.com/commits/1/comments", status=201, body=json.dumps({"id": 1}), content_type="application/json") httpretty.register_uri(httpretty.POST, "https://api.github.com/pulls/1/comments", status=201, body=json.dumps({"id": 3}), content_type="application/json") status = {"id": 1, "state": "success"} httpretty.register_uri(httpretty.POST, "https://api.github.com/statuses/1", status=201, body=json.dumps(status), content_type="application/json") cs = [] for commit in commits: cs.append( CommitStatus.find_or_create(repository, commit["sha"], commit["url"])) bs = BranchStatus(cs[-1], "test:my-branch", "http://github.com/pulls/1", { "commits": cs, "files": None }) session.add(bs) session.commit() httpretty.enable() pull_request( bs.id, "https://api.github.com/pulls/1", "http://kwalitee.invenio-software.org/status/1", { "TRUSTED_DEVELOPERS": ["*****@*****.**"], "COMPONENTS": ["herp"], "SIGNATURES": ["Signed-off-by"], "IGNORE": ["E265", "D100"] }) httpretty.disable() latest_requests = httpretty.HTTPretty.latest_requests # 5x GET pull, .kwalitee.yml, issue, commits, 1 file, spam/eggs.py # 2x POST status, label assert_that(len(latest_requests), equal_to(8), "6x GET + 2x POST") expected_requests = [ "", "", "", "", "", "/status/1", "", "in_integration", ] for expected, request in zip(expected_requests, latest_requests): assert_that(str(request.body), contains_string(expected)) body = json.loads(latest_requests[-3].body) assert_that(latest_requests[-3].headers["authorization"], equal_to("token {0}".format(owner.token))) assert_that(body["state"], equal_to("success")) cs = CommitStatus.query.filter_by(repository_id=repository.id).all() assert_that(cs, has_length(1)) assert_that(cs[0].content["files"] is None) assert_that(cs[0].is_pending(), equal_to(False)) bs = BranchStatus.query.filter_by(commit_id=cs[0].id, name="test:my-branch").first() assert_that(bs.errors, equal_to(0)) assert_that(bs.content["commits"], has_length(1)) assert_that(bs.content["files"]["eggs/__init__.py"]["errors"], has_length(0))
def test_wip_pull_request_task(app, owner, repository, session): """Task pull_request /pulls/1 is work in progress""" httpretty.reset() pull = { "title": "WIP Lorem ipsum", "url": "https://api.github.com/pulls/1", "html_url": "https://github.com/pulls/1", "commits_url": "https://api.github.com/pulls/1/commits", "statuses_url": "https://api.github.com/statuses/1", "review_comments_url": "https://api.github.com/pulls/1/comments", "issue_url": "https://api.github.com/issues/1", "head": { "sha": "2", "label": "test:my-branch" }, "base": { "repo": { "full_name": "kwalitee/test" }, "ref": "testref" }, } httpretty.register_uri(httpretty.GET, "https://api.github.com/pulls/1", body=json.dumps(pull), content_type="application/json") httpretty.register_uri(httpretty.GET, "https://api.github.com/repos/kwalitee/test/" "contents/.kwalitee.yml?ref=testref", status=404) commits = [{ "url": "https://api.github.com/commits/1", "sha": "1", "html_url": "https://github.com/commits/1", "comments_url": "https://api.github.com/commits/1/comments", "commit": { "message": "fix all the bugs!" } }, { "url": "https://api.github.com/commits/2", "sha": "2", "html_url": "https://github.com/commits/2", "comments_url": "https://api.github.com/commits/2/comments", "commit": { "message": "herp derp" } }] httpretty.register_uri(httpretty.GET, "https://api.github.com/pulls/1/commits", body=json.dumps(commits), content_type="application/json") issue = { "url": "https://api.github.com/issues/1", "html_url": "https://github.com/issues/1", "labels_url": "https://api.github.com/issues/1/labels{/name}", "id": "42", "number": "1", "labels": [{ "name": "foo" }, { "name": "in_integration" }], "state": "open" } httpretty.register_uri(httpretty.GET, "https://api.github.com/issues/1", body=json.dumps(issue), content_type="application/json") labels = [{ "url": "https://github.com/labels/foo", "name": "foo", "color": "000000" }, { "url": "https://github.com/labels/in_review", "name": "in_review", "color": "ff0000" }] httpretty.register_uri(httpretty.PUT, "https://api.github.com/issues/1/labels", status=200, body=json.dumps(issue), content_type="application/json") css = [] for commit in commits: css.append( CommitStatus.find_or_create(repository, commit["sha"], commit["url"])) bs = BranchStatus(css[-1], "test:my-branch", "https://github.com/pulls/1", { "commits": css, "files": None }) session.add(bs) session.commit() assert_that(bs.is_pending()) httpretty.enable() pull_request(bs.id, "https://api.github.com/pulls/1", "http://kwalitee.invenio-software.org/status/1", {"repository": repository.id}) httpretty.disable() latest_requests = httpretty.HTTPretty.latest_requests # 4x GET pull, .kwalitee.yml, commits, issue # 1x POST labels assert_that(len(latest_requests), equal_to(5), "4x GET + 1x POST") expected_requests = ["", "", "", "", "in_work"] for expected, request in zip(expected_requests, latest_requests): assert_that(str(request.body), contains_string(expected)) labels = json.loads(latest_requests[-1].body) assert_that(labels, has_items("in_work", "foo")) assert_that(labels, is_not(has_item("in_review")))
def test_pull_request_task(app, owner, repository, session): """Task pull_request /pulls/1""" httpretty.reset() pull = { "title": "Lorem ipsum", "url": "https://api.github.com/pulls/1", "html_url": "https://github.com/pulls/1", "commits_url": "https://api.github.com/pulls/1/commits", "statuses_url": "https://api.github.com/statuses/2", "review_comments_url": "https://api.github.com/pulls/1/comments", "issue_url": "https://api.github.com/issues/1", "head": { "sha": "2", "label": "test:my-branch" }, "base": { "repo": { "full_name": "kwalitee/test" }, "ref": "testref" }, } httpretty.register_uri(httpretty.GET, "https://api.github.com/pulls/1", body=json.dumps(pull), content_type="application/json") httpretty.register_uri(httpretty.GET, "https://api.github.com/repos/kwalitee/test/" "contents/.kwalitee.yml?ref=testref", status=404) issue = { "url": "https://api.github.com/issues/1", "html_url": "https://github.com/issues/1", "labels_url": "https://api.github.com/issues/1/labels{/name}", "id": "42", "number": "1", "labels": [{ "name": "foo" }, { "name": "in_work" }], "state": "open" } httpretty.register_uri(httpretty.GET, "https://api.github.com/issues/1", body=json.dumps(issue), content_type="application/json") labels = [{ "url": "https://github.com/labels/foo", "name": "foo", "color": "000000" }, { "url": "https://github.com/labels/in_review", "name": "in_review", "color": "ff0000" }] httpretty.register_uri(httpretty.PUT, "https://api.github.com/issues/1/labels", status=200, body=json.dumps(labels), content_type="application/json") commits = [{ "url": "https://api.github.com/commits/1", "sha": "1", "html_url": "https://github.com/commits/1", "comments_url": "https://api.github.com/commits/1/comments", "commit": { "message": "fix all the bugs!" } }, { "url": "https://api.github.com/commits/2", "sha": "2", "html_url": "https://github.com/commits/2", "comments_url": "https://api.github.com/commits/1/comments", "commit": { "message": "herp derp" } }] httpretty.register_uri(httpretty.GET, "https://api.github.com/pulls/1/commits", body=json.dumps(commits), content_type="application/json") files = [{ "filename": "spam/eggs.py", "status": "added", "raw_url": "https://github.com/raw/2/spam/eggs.py", "contents_url": "https://api.github.com/spam/eggs.py?ref=2" }, { "filename": "spam/herp.html", "status": "added", "raw_url": "https://github.com/raw/2/spam/herp.html", "contents_url": "https://api.github.com/spam/herp.html?ref=2" }] httpretty.register_uri(httpretty.GET, "https://api.github.com/pulls/1/files", body=json.dumps(files), content_type="application/json") eggs_py = "if foo == bar:\n print('derp')\n" httpretty.register_uri(httpretty.GET, "https://github.com/raw/2/spam/eggs.py", body=eggs_py, content_type="text/plain") herp_html = "<!DOCTYPE html><html><title>Hello!</title></html>" httpretty.register_uri(httpretty.GET, "https://github.com/raw/2/spam/herp.html", body=herp_html, content_type="text/html") httpretty.register_uri(httpretty.POST, "https://api.github.com/commits/1/comments", status=201, body=json.dumps({"id": 1}), content_type="application/json") httpretty.register_uri(httpretty.POST, "https://api.github.com/commits/2/comments", status=201, body=json.dumps({"id": 2}), content_type="application/json") httpretty.register_uri(httpretty.POST, "https://api.github.com/pulls/1/comments", status=201, body=json.dumps({"id": 3}), content_type="application/json") status = {"id": 1, "state": "success"} httpretty.register_uri(httpretty.POST, "https://api.github.com/statuses/2", status=201, body=json.dumps(status), content_type="application/json") css = [] for commit in commits: css.append( CommitStatus.find_or_create(repository, commit["sha"], commit["url"])) bs = BranchStatus(css[-1], "test:my-branch", "https://github.com/pulls/1", { "commits": css, "files": None }) session.add(bs) session.commit() assert_that(css[0].is_pending()) assert_that(css[1].is_pending()) assert_that(bs.is_pending()) httpretty.enable() pull_request(bs.id, "https://api.github.com/pulls/1", "http://kwalitee.invenio-software.org/status/2", {"repository": repository.id}) httpretty.disable() latest_requests = httpretty.HTTPretty.latest_requests # 7x GET pull, .kwalitee.yml, issue, commits, files, spam/eggs.py, # spam/herp.html # 5x POST comments (1 message + 2 files), status # 1x PUT labels assert_that(len(latest_requests), equal_to(12), "7x GET + 4x POST + 1 PUT") expected_requests = [ "", "", "", "missing component name", # "signature is missing", "", "", "", "F821 undefined name", "L101 copyright is missing", "/status/2", "", "in_review" ] for expected, request in zip(expected_requests, latest_requests): assert_that(str(request.body), contains_string(expected)) body = json.loads(latest_requests[-3].body) assert_that(latest_requests[-3].headers["authorization"], equal_to("token {0}".format(owner.token))) assert_that(body["state"], equal_to("error")) cs = CommitStatus.query.filter_by(repository_id=repository.id).all() assert_that(cs, has_length(2)) assert_that(cs[0].content["message"], has_item("1: M110 missing component name")) assert_that(cs[1].content["message"], has_item("1: M100 needs more reviewers")) bs = BranchStatus.query.filter_by(commit_id=cs[1].id, name="test:my-branch").first() assert_that(bs) assert_that(bs.content["commits"], has_items("1", "2")) assert_that(bs.errors, equal_to(12)) assert_that(bs.content["files"]["spam/eggs.py"]["errors"], has_item("2:3: E111 indentation is not a multiple of four"))
def test_pep8_pull_request_task(app, owner, repository, session): """Task pull_request /pulls/1 with pep8 errors""" httpretty.reset() pull = { "title": "Lorem ipsum", "url": "https://api.github.com/pulls/1", "html_url": "https://github.com/pulls/1", "commits_url": "https://api.github.com/pulls/1/commits", "statuses_url": "https://api.github.com/statuses/1", "issue_url": "https://api.github.com/issues/1", "review_comments_url": "https://api.github.com/pulls/1/comments", "head": { "sha": "1", "label": "test:my-branch" }, "base": { "repo": { "full_name": "kwalitee/test" }, "ref": "testref" }, } httpretty.register_uri(httpretty.GET, "https://api.github.com/pulls/1", body=json.dumps(pull), content_type="application/json") httpretty.register_uri(httpretty.GET, "https://api.github.com/repos/kwalitee/test/" "contents/.kwalitee.yml?ref=testref", status=404) issue = { "url": "https://api.github.com/issues/1", "html_url": "https://github.com/issues/1", "labels_url": "https://api.github.com/issues/1/labels{/name}", "id": "42", "number": "1", "labels": [{"name": "foo"}, {"name": "in_work"}], "state": "open" } httpretty.register_uri(httpretty.GET, "https://api.github.com/issues/1", body=json.dumps(issue), content_type="application/json") labels = [{ "url": "https://github.com/labels/foo", "name": "foo", "color": "000000" }, { "url": "https://github.com/labels/in_review", "name": "in_review", "color": "ff0000" }] httpretty.register_uri(httpretty.PUT, "https://api.github.com/issues/1/labels", status=200, body=json.dumps(labels), content_type="application/json") commits = [ { "url": "https://api.github.com/commits/2", "sha": "2", "html_url": "https://github.com/commits/2", "comments_url": "https://api.github.com/commits/1/comments", "commit": { "message": "herp: derp\r\n\r\nSigned-off-by: John Doe " "<*****@*****.**>" } } ] httpretty.register_uri(httpretty.GET, "https://api.github.com/pulls/1/commits", body=json.dumps(commits), content_type="application/json") files = [{ "filename": "spam/eggs.py", "status": "added", "raw_url": "https://github.com/raw/2/spam/eggs.py", "contents_url": "https://api.github.com/spam/eggs.py?ref=1" }] httpretty.register_uri(httpretty.GET, "https://api.github.com/pulls/1/files", body=json.dumps(files), content_type="application/json") eggs_py = "if foo == bar:\n print('derp')\n" httpretty.register_uri(httpretty.GET, "https://github.com/raw/2/spam/eggs.py", body=eggs_py, content_type="text/plain") httpretty.register_uri(httpretty.POST, "https://api.github.com/commits/1/comments", status=201, body=json.dumps({"id": 1}), content_type="application/json") httpretty.register_uri(httpretty.POST, "https://api.github.com/pulls/1/comments", status=201, body=json.dumps({"id": 3}), content_type="application/json") status = {"id": 1, "state": "success"} httpretty.register_uri(httpretty.POST, "https://api.github.com/statuses/1", status=201, body=json.dumps(status), content_type="application/json") cs = [] for commit in commits: cs.append(CommitStatus.find_or_create(repository, commit["sha"], commit["url"])) bs = BranchStatus(cs[0], "test:my-branch", "https://github.com/pulls/1", {"commits": cs, "files": None}) session.add(bs) session.commit() assert_that(bs.is_pending()) httpretty.enable() pull_request(bs.id, "https://api.github.com/pulls/1", "http://kwalitee.invenio-software.org/status/1", {"TRUSTED_DEVELOPERS": ["*****@*****.**"], "COMPONENTS": ["herp"], "SIGNATURES": ["Signed-off-by"]}) httpretty.disable() latest_requests = httpretty.HTTPretty.latest_requests # 6x GET pull, .kwalitee.yml, issue, commits, 1 file, spam/eggs.py # 3x POST comments (1xfile), status, label assert_that(len(latest_requests), equal_to(9), "6x GET + 3x POST") expected_requests = [ "", "", "", "", "", "D100 Missing docstring in public module", "/status/1", "", "in_review", ] for expected, request in zip(expected_requests, latest_requests): assert_that(str(request.body), contains_string(expected)) body = json.loads(latest_requests[-3].body) assert_that(latest_requests[-3].headers["authorization"], equal_to("token {0}".format(owner.token))) assert_that(body["state"], equal_to("error")) cs = CommitStatus.query.filter_by(repository_id=repository.id, ).all() assert_that(cs, has_length(1)) assert_that(cs[0].content["files"] is None) assert_that(cs[0].sha, equal_to("2")) assert_that(cs[0].is_pending(), equal_to(False)) bs = BranchStatus.query.filter_by(commit_id=cs[0].id, name="test:my-branch").first() assert_that(bs) assert_that(bs.errors, equal_to(5)) assert_that( bs.content["files"]["spam/eggs.py"]["errors"], has_item("2:3: E111 indentation is not a multiple of four"))
def test_wip_pull_request_task(app, owner, repository, session): """Task pull_request /pulls/1 is work in progress""" httpretty.reset() pull = { "title": "WIP Lorem ipsum", "url": "https://api.github.com/pulls/1", "html_url": "https://github.com/pulls/1", "commits_url": "https://api.github.com/pulls/1/commits", "statuses_url": "https://api.github.com/statuses/1", "review_comments_url": "https://api.github.com/pulls/1/comments", "issue_url": "https://api.github.com/issues/1", "head": { "sha": "2", "label": "test:my-branch" }, "base": { "repo": { "full_name": "kwalitee/test" }, "ref": "testref" }, } httpretty.register_uri(httpretty.GET, "https://api.github.com/pulls/1", body=json.dumps(pull), content_type="application/json") httpretty.register_uri(httpretty.GET, "https://api.github.com/repos/kwalitee/test/" "contents/.kwalitee.yml?ref=testref", status=404) commits = [ { "url": "https://api.github.com/commits/1", "sha": "1", "html_url": "https://github.com/commits/1", "comments_url": "https://api.github.com/commits/1/comments", "commit": { "message": "fix all the bugs!" } }, { "url": "https://api.github.com/commits/2", "sha": "2", "html_url": "https://github.com/commits/2", "comments_url": "https://api.github.com/commits/2/comments", "commit": { "message": "herp derp" } } ] httpretty.register_uri(httpretty.GET, "https://api.github.com/pulls/1/commits", body=json.dumps(commits), content_type="application/json") issue = { "url": "https://api.github.com/issues/1", "html_url": "https://github.com/issues/1", "labels_url": "https://api.github.com/issues/1/labels{/name}", "id": "42", "number": "1", "labels": [{"name": "foo"}, {"name": "in_integration"}], "state": "open" } httpretty.register_uri(httpretty.GET, "https://api.github.com/issues/1", body=json.dumps(issue), content_type="application/json") labels = [{ "url": "https://github.com/labels/foo", "name": "foo", "color": "000000" }, { "url": "https://github.com/labels/in_review", "name": "in_review", "color": "ff0000" }] httpretty.register_uri(httpretty.PUT, "https://api.github.com/issues/1/labels", status=200, body=json.dumps(issue), content_type="application/json") css = [] for commit in commits: css.append(CommitStatus.find_or_create(repository, commit["sha"], commit["url"])) bs = BranchStatus(css[-1], "test:my-branch", "https://github.com/pulls/1", {"commits": css, "files": None}) session.add(bs) session.commit() assert_that(bs.is_pending()) httpretty.enable() pull_request(bs.id, "https://api.github.com/pulls/1", "http://kwalitee.invenio-software.org/status/1", {"repository": repository.id}) httpretty.disable() latest_requests = httpretty.HTTPretty.latest_requests # 4x GET pull, .kwalitee.yml, commits, issue # 1x POST labels assert_that(len(latest_requests), equal_to(5), "4x GET + 1x POST") expected_requests = [ "", "", "", "", "in_work" ] for expected, request in zip(expected_requests, latest_requests): assert_that(str(request.body), contains_string(expected)) labels = json.loads(latest_requests[-1].body) assert_that(labels, has_items("in_work", "foo")) assert_that(labels, is_not(has_item("in_review")))
def test_pull_request_task(app, owner, repository, session): """Task pull_request /pulls/1""" httpretty.reset() pull = { "title": "Lorem ipsum", "url": "https://api.github.com/pulls/1", "html_url": "https://github.com/pulls/1", "commits_url": "https://api.github.com/pulls/1/commits", "statuses_url": "https://api.github.com/statuses/2", "review_comments_url": "https://api.github.com/pulls/1/comments", "issue_url": "https://api.github.com/issues/1", "head": { "sha": "2", "label": "test:my-branch" }, "base": { "repo": { "full_name": "kwalitee/test" }, "ref": "testref" }, } httpretty.register_uri(httpretty.GET, "https://api.github.com/pulls/1", body=json.dumps(pull), content_type="application/json") httpretty.register_uri(httpretty.GET, "https://api.github.com/repos/kwalitee/test/" "contents/.kwalitee.yml?ref=testref", status=404) issue = { "url": "https://api.github.com/issues/1", "html_url": "https://github.com/issues/1", "labels_url": "https://api.github.com/issues/1/labels{/name}", "id": "42", "number": "1", "labels": [{"name": "foo"}, {"name": "in_work"}], "state": "open" } httpretty.register_uri(httpretty.GET, "https://api.github.com/issues/1", body=json.dumps(issue), content_type="application/json") labels = [{ "url": "https://github.com/labels/foo", "name": "foo", "color": "000000" }, { "url": "https://github.com/labels/in_review", "name": "in_review", "color": "ff0000" }] httpretty.register_uri(httpretty.PUT, "https://api.github.com/issues/1/labels", status=200, body=json.dumps(labels), content_type="application/json") commits = [ { "url": "https://api.github.com/commits/1", "sha": "1", "html_url": "https://github.com/commits/1", "comments_url": "https://api.github.com/commits/1/comments", "commit": { "message": "fix all the bugs!" } }, { "url": "https://api.github.com/commits/2", "sha": "2", "html_url": "https://github.com/commits/2", "comments_url": "https://api.github.com/commits/1/comments", "commit": { "message": "herp derp" } } ] httpretty.register_uri(httpretty.GET, "https://api.github.com/pulls/1/commits", body=json.dumps(commits), content_type="application/json") files = [{ "filename": "spam/eggs.py", "status": "added", "raw_url": "https://github.com/raw/2/spam/eggs.py", "contents_url": "https://api.github.com/spam/eggs.py?ref=2" }, { "filename": "spam/herp.html", "status": "added", "raw_url": "https://github.com/raw/2/spam/herp.html", "contents_url": "https://api.github.com/spam/herp.html?ref=2" }] httpretty.register_uri(httpretty.GET, "https://api.github.com/pulls/1/files", body=json.dumps(files), content_type="application/json") eggs_py = "if foo == bar:\n print('derp')\n" httpretty.register_uri(httpretty.GET, "https://github.com/raw/2/spam/eggs.py", body=eggs_py, content_type="text/plain") herp_html = "<!DOCTYPE html><html><title>Hello!</title></html>" httpretty.register_uri(httpretty.GET, "https://github.com/raw/2/spam/herp.html", body=herp_html, content_type="text/html") httpretty.register_uri(httpretty.POST, "https://api.github.com/commits/1/comments", status=201, body=json.dumps({"id": 1}), content_type="application/json") httpretty.register_uri(httpretty.POST, "https://api.github.com/commits/2/comments", status=201, body=json.dumps({"id": 2}), content_type="application/json") httpretty.register_uri(httpretty.POST, "https://api.github.com/pulls/1/comments", status=201, body=json.dumps({"id": 3}), content_type="application/json") status = {"id": 1, "state": "success"} httpretty.register_uri(httpretty.POST, "https://api.github.com/statuses/2", status=201, body=json.dumps(status), content_type="application/json") css = [] for commit in commits: css.append(CommitStatus.find_or_create(repository, commit["sha"], commit["url"])) bs = BranchStatus(css[-1], "test:my-branch", "https://github.com/pulls/1", {"commits": css, "files": None}) session.add(bs) session.commit() assert_that(css[0].is_pending()) assert_that(css[1].is_pending()) assert_that(bs.is_pending()) httpretty.enable() pull_request(bs.id, "https://api.github.com/pulls/1", "http://kwalitee.invenio-software.org/status/2", {"repository": repository.id}) httpretty.disable() latest_requests = httpretty.HTTPretty.latest_requests # 7x GET pull, .kwalitee.yml, issue, commits, files, spam/eggs.py, # spam/herp.html # 5x POST comments (1 message + 2 files), status # 1x PUT labels assert_that(len(latest_requests), equal_to(12), "7x GET + 4x POST + 1 PUT") expected_requests = [ "", "", "", "missing component name", # "signature is missing", "", "", "", "F821 undefined name", "L101 copyright is missing", "/status/2", "", "in_review" ] for expected, request in zip(expected_requests, latest_requests): assert_that(str(request.body), contains_string(expected)) body = json.loads(latest_requests[-3].body) assert_that(latest_requests[-3].headers["authorization"], equal_to("token {0}".format(owner.token))) assert_that(body["state"], equal_to("error")) cs = CommitStatus.query.filter_by(repository_id=repository.id).all() assert_that(cs, has_length(2)) assert_that(cs[0].content["message"], has_item("1: M110 missing component name")) assert_that(cs[1].content["message"], has_item("1: M100 needs more reviewers")) bs = BranchStatus.query.filter_by(commit_id=cs[1].id, name="test:my-branch").first() assert_that(bs) assert_that(bs.content["commits"], has_items("1", "2")) assert_that(bs.errors, equal_to(12)) assert_that( bs.content["files"]["spam/eggs.py"]["errors"], has_item("2:3: E111 indentation is not a multiple of four"))