keel/pkg/http/github_webhook_trigger_test.go

407 lines
19 KiB
Go

package http
import (
"bytes"
"net/http"
"net/http/httptest"
"testing"
)
var fakeGithubPackageWebhook = `{
"action": "published",
"registry_package": {
"id": 35087,
"name": "server",
"package_type": "CONTAINER",
"html_url": "https://github.com/DingGGu/UtaiteBOX/packages/35087",
"created_at": "2019-10-11T18:18:58Z",
"updated_at": "2019-10-11T18:18:58Z",
"owner": {
"login": "DingGGu",
"id": 2981443,
"node_id": "MDQ6VXNlcjI5ODE0NDM=",
"avatar_url": "https://avatars3.githubusercontent.com/u/2981443?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/DingGGu",
"html_url": "https://github.com/DingGGu",
"followers_url": "https://api.github.com/users/DingGGu/followers",
"following_url": "https://api.github.com/users/DingGGu/following{/other_user}",
"gists_url": "https://api.github.com/users/DingGGu/gists{/gist_id}",
"starred_url": "https://api.github.com/users/DingGGu/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/DingGGu/subscriptions",
"organizations_url": "https://api.github.com/users/DingGGu/orgs",
"repos_url": "https://api.github.com/users/DingGGu/repos",
"events_url": "https://api.github.com/users/DingGGu/events{/privacy}",
"received_events_url": "https://api.github.com/users/DingGGu/received_events",
"type": "User",
"site_admin": false
},
"package_version": {
"id": 130771,
"version": "1.2.3",
"summary": "",
"body": "",
"body_html": "",
"manifest": "{\n \"schemaVersion\": 2,\n \"mediaType\": \"application/vnd.docker.distribution.manifest.v2+json\",\n \"config\": {\n \"mediaType\": \"application/vnd.docker.container.image.v1+json\",\n \"size\": 1709,\n \"digest\": \"sha256:2b94d3d75692e4b04dde5046ad3246fe01cc8889cb641c3e116f10e41c51e164\"\n },\n \"layers\": [\n {\n \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n \"size\": 2789669,\n \"digest\": \"sha256:9d48c3bd43c520dc2784e868a780e976b207cbf493eaff8c6596eb871cbd9609\"\n },\n {\n \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n \"size\": 350,\n \"digest\": \"sha256:957045d2b582f07cdc07ebbc7d971239bb7bc19f78216fe547609ff495b007f5\"\n }\n ]\n}",
"html_url": "https://github.com/DingGGu/UtaiteBOX/packages/35087?version=1.2.3",
"target_commitish": "ts",
"target_oid": "68d2fd4969f35b650b5863da9220a2561ced6f7b",
"created_at": "2019-10-11T18:19:06Z",
"updated_at": "2019-11-01T05:30:31Z",
"metadata": [
],
"package_files": [
{
"download_url": "https://github-production-registry-package-file-4f11e5.s3.amazonaws.com/32367513/0804d380-ec9f-11e9-8306-7f87c59605d3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20191101%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20191101T053031Z&X-Amz-Expires=300&X-Amz-Signature=d724dc6416ae277e3754530ac83bd5d33b44ceb5fcd8c0fee41c0fa84df1d942&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=filename%3D0804d380-ec9f-11e9-8306-7f87c59605d3&response-content-type=application%2Foctet-stream",
"id": 448033,
"name": "0804d380-ec9f-11e9-8306-7f87c59605d3",
"sha256": "957045d2b582f07cdc07ebbc7d971239bb7bc19f78216fe547609ff495b007f5",
"sha1": null,
"md5": null,
"content_type": "application/octet-stream",
"state": "uploaded",
"size": 350,
"created_at": "2019-10-11T18:18:59Z",
"updated_at": "2019-10-11T18:19:06Z"
},
{
"download_url": "https://github-production-registry-package-file-4f11e5.s3.amazonaws.com/32367513/0804d380-ec9f-11e9-985b-72c935b667c2?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20191101%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20191101T053031Z&X-Amz-Expires=300&X-Amz-Signature=eee79a1840857f2a651a9299aee338b0e8994800d39985a2d72a77980d86c813&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=filename%3D0804d380-ec9f-11e9-985b-72c935b667c2&response-content-type=application%2Foctet-stream",
"id": 448034,
"name": "0804d380-ec9f-11e9-985b-72c935b667c2",
"sha256": "9d48c3bd43c520dc2784e868a780e976b207cbf493eaff8c6596eb871cbd9609",
"sha1": null,
"md5": null,
"content_type": "application/octet-stream",
"state": "uploaded",
"size": 2789669,
"created_at": "2019-10-11T18:18:59Z",
"updated_at": "2019-10-11T18:19:06Z"
},
{
"download_url": "https://github-production-registry-package-file-4f11e5.s3.amazonaws.com/32367513/0a672d80-ec9f-11e9-8b8c-6867f9c0ea4e?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20191101%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20191101T053031Z&X-Amz-Expires=300&X-Amz-Signature=9a0a71caf7b65ec2406ba84aa28552df8b07ca9bad6b0f7091e0beadfa9c11f1&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=filename%3D0a672d80-ec9f-11e9-8b8c-6867f9c0ea4e&response-content-type=application%2Foctet-stream",
"id": 448035,
"name": "0a672d80-ec9f-11e9-8b8c-6867f9c0ea4e",
"sha256": "2b94d3d75692e4b04dde5046ad3246fe01cc8889cb641c3e116f10e41c51e164",
"sha1": null,
"md5": null,
"content_type": "application/octet-stream",
"state": "uploaded",
"size": 1709,
"created_at": "2019-10-11T18:19:03Z",
"updated_at": "2019-10-11T18:19:06Z"
}
],
"author": {
"login": "DingGGu",
"id": 2981443,
"node_id": "MDQ6VXNlcjI5ODE0NDM=",
"avatar_url": "https://avatars3.githubusercontent.com/u/2981443?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/DingGGu",
"html_url": "https://github.com/DingGGu",
"followers_url": "https://api.github.com/users/DingGGu/followers",
"following_url": "https://api.github.com/users/DingGGu/following{/other_user}",
"gists_url": "https://api.github.com/users/DingGGu/gists{/gist_id}",
"starred_url": "https://api.github.com/users/DingGGu/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/DingGGu/subscriptions",
"organizations_url": "https://api.github.com/users/DingGGu/orgs",
"repos_url": "https://api.github.com/users/DingGGu/repos",
"events_url": "https://api.github.com/users/DingGGu/events{/privacy}",
"received_events_url": "https://api.github.com/users/DingGGu/received_events",
"type": "User",
"site_admin": false
},
"installation_command": ""
},
"registry": {
"about_url": "https://help.github.com/about-github-package-registry",
"name": "GitHub docker registry",
"type": "docker",
"url": "https://ghcr.io/DingGGu/UtaiteBOX",
"vendor": "GitHub Inc"
}
},
"repository": {
"id": 32367513,
"node_id": "MDEwOlJlcG9zaXRvcnkzMjM2NzUxMw==",
"name": "UtaiteBOX",
"full_name": "DingGGu/UtaiteBOX",
"private": true,
"owner": {
"login": "DingGGu",
"id": 2981443,
"node_id": "MDQ6VXNlcjI5ODE0NDM=",
"avatar_url": "https://avatars3.githubusercontent.com/u/2981443?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/DingGGu",
"html_url": "https://github.com/DingGGu",
"followers_url": "https://api.github.com/users/DingGGu/followers",
"following_url": "https://api.github.com/users/DingGGu/following{/other_user}",
"gists_url": "https://api.github.com/users/DingGGu/gists{/gist_id}",
"starred_url": "https://api.github.com/users/DingGGu/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/DingGGu/subscriptions",
"organizations_url": "https://api.github.com/users/DingGGu/orgs",
"repos_url": "https://api.github.com/users/DingGGu/repos",
"events_url": "https://api.github.com/users/DingGGu/events{/privacy}",
"received_events_url": "https://api.github.com/users/DingGGu/received_events",
"type": "User",
"site_admin": false
},
"html_url": "https://github.com/DingGGu/UtaiteBOX",
"description": "UtaiteBOX",
"fork": false,
"url": "https://api.github.com/repos/DingGGu/UtaiteBOX",
"forks_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/forks",
"keys_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/teams",
"hooks_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/hooks",
"issue_events_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/issues/events{/number}",
"events_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/events",
"assignees_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/assignees{/user}",
"branches_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/branches{/branch}",
"tags_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/tags",
"blobs_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/statuses/{sha}",
"languages_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/languages",
"stargazers_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/stargazers",
"contributors_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/contributors",
"subscribers_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/subscribers",
"subscription_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/subscription",
"commits_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/contents/{+path}",
"compare_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/merges",
"archive_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/downloads",
"issues_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/issues{/number}",
"pulls_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/pulls{/number}",
"milestones_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/milestones{/number}",
"notifications_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/labels{/name}",
"releases_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/releases{/id}",
"deployments_url": "https://api.github.com/repos/DingGGu/UtaiteBOX/deployments",
"created_at": "2015-03-17T02:49:38Z",
"updated_at": "2019-01-06T12:48:56Z",
"pushed_at": "2019-08-29T03:07:48Z",
"git_url": "git://github.com/DingGGu/UtaiteBOX.git",
"ssh_url": "git@github.com:DingGGu/UtaiteBOX.git",
"clone_url": "https://github.com/DingGGu/UtaiteBOX.git",
"svn_url": "https://github.com/DingGGu/UtaiteBOX",
"homepage": "https://www.utaitebox.com/",
"size": 113576,
"stargazers_count": 4,
"watchers_count": 4,
"language": "TypeScript",
"has_issues": true,
"has_projects": true,
"has_downloads": true,
"has_wiki": true,
"has_pages": false,
"forks_count": 1,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 14,
"license": null,
"forks": 1,
"open_issues": 14,
"watchers": 4,
"default_branch": "ts"
},
"sender": {
"login": "DingGGu",
"id": 2981443,
"node_id": "MDQ6VXNlcjI5ODE0NDM=",
"avatar_url": "https://avatars3.githubusercontent.com/u/2981443?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/DingGGu",
"html_url": "https://github.com/DingGGu",
"followers_url": "https://api.github.com/users/DingGGu/followers",
"following_url": "https://api.github.com/users/DingGGu/following{/other_user}",
"gists_url": "https://api.github.com/users/DingGGu/gists{/gist_id}",
"starred_url": "https://api.github.com/users/DingGGu/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/DingGGu/subscriptions",
"organizations_url": "https://api.github.com/users/DingGGu/orgs",
"repos_url": "https://api.github.com/users/DingGGu/repos",
"events_url": "https://api.github.com/users/DingGGu/events{/privacy}",
"received_events_url": "https://api.github.com/users/DingGGu/received_events",
"type": "User",
"site_admin": false
}
}`
var fakeGithubContainerRegistryWebhook = `{
"action": "create",
"package": {
"id": 779666,
"name": "utaitebox-server",
"namespace": "utaitebox",
"description": "",
"ecosystem": "CONTAINER",
"html_url": "https://github.com/utaitebox/packages/779666",
"created_at": "0001-01-01T00:00:00Z",
"updated_at": "0001-01-01T00:00:00Z",
"package_version": {
"id": 1284299,
"name": "sha256:7d3848ba2f2e7f69bebb4b576e5fad0379b64a0b1512aee6ad0ec9e7c6319fed",
"description": "",
"blob_store": "s3",
"html_url": "https://github.com/utaitebox/packages/779666?version=1284299",
"created_at": "0001-01-01T00:00:00Z",
"updated_at": "0001-01-01T00:00:00Z",
"container_metadata": {
"tag": {
"name": "3.2.1",
"digest": "sha256:7d3848ba2f2e7f69bebb4b576e5fad0379b64a0b1512aee6ad0ec9e7c6319fed"
},
"labels": {
"description": "",
"source": "",
"revision": "",
"image_url": "",
"licenses": "",
"all_labels": {
}
},
"manifest": {
"digest": "sha256:7d3848ba2f2e7f69bebb4b576e5fad0379b64a0b1512aee6ad0ec9e7c6319fed",
"media_type": "application/vnd.docker.distribution.manifest.v2+json",
"uri": "repositories/utaitebox/utaitebox-server/manifests/sha256:7d3848ba2f2e7f69bebb4b576e5fad0379b64a0b1512aee6ad0ec9e7c6319fed",
"size": 735,
"config": {
"digest": "sha256:2b94d3d75692e4b04dde5046ad3246fe01cc8889cb641c3e116f10e41c51e164",
"media_type": "application/vnd.docker.container.image.v1+json",
"size": 1709
},
"layers": [
{
"digest": "sha256:9d48c3bd43c520dc2784e868a780e976b207cbf493eaff8c6596eb871cbd9609",
"media_type": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 2789669
},
{
"digest": "sha256:957045d2b582f07cdc07ebbc7d971239bb7bc19f78216fe547609ff495b007f5",
"media_type": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 350
}
]
}
}
}
},
"organization": {
"login": "UtaiteBOX",
"id": 65208347,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjY1MjA4MzQ3",
"url": "https://api.github.com/orgs/UtaiteBOX",
"repos_url": "https://api.github.com/orgs/UtaiteBOX/repos",
"events_url": "https://api.github.com/orgs/UtaiteBOX/events",
"hooks_url": "https://api.github.com/orgs/UtaiteBOX/hooks",
"issues_url": "https://api.github.com/orgs/UtaiteBOX/issues",
"members_url": "https://api.github.com/orgs/UtaiteBOX/members{/member}",
"public_members_url": "https://api.github.com/orgs/UtaiteBOX/public_members{/member}",
"avatar_url": "https://avatars.githubusercontent.com/u/65208347?v=4",
"description": null
},
"sender": {
"login": "DingGGu",
"id": 2981443,
"node_id": "MDQ6VXNlcjI5ODE0NDM=",
"avatar_url": "https://avatars.githubusercontent.com/u/2981443?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/DingGGu",
"html_url": "https://github.com/DingGGu",
"followers_url": "https://api.github.com/users/DingGGu/followers",
"following_url": "https://api.github.com/users/DingGGu/following{/other_user}",
"gists_url": "https://api.github.com/users/DingGGu/gists{/gist_id}",
"starred_url": "https://api.github.com/users/DingGGu/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/DingGGu/subscriptions",
"organizations_url": "https://api.github.com/users/DingGGu/orgs",
"repos_url": "https://api.github.com/users/DingGGu/repos",
"events_url": "https://api.github.com/users/DingGGu/events{/privacy}",
"received_events_url": "https://api.github.com/users/DingGGu/received_events",
"type": "User",
"site_admin": false
}
}`
func TestGithubPackageWebhookHandler(t *testing.T) {
fp := &fakeProvider{}
srv, teardown := NewTestingServer(fp)
defer teardown()
req, err := http.NewRequest("POST", "/v1/webhooks/github", bytes.NewBuffer([]byte(fakeGithubPackageWebhook)))
if err != nil {
t.Fatalf("failed to create req: %s", err)
}
req.Header.Set("X-GitHub-Event", "registry_package")
//The response recorder used to record HTTP responses
rec := httptest.NewRecorder()
srv.router.ServeHTTP(rec, req)
if rec.Code != 200 {
t.Errorf("unexpected status code: %d", rec.Code)
t.Log(rec.Body.String())
}
if len(fp.submitted) != 1 {
t.Fatalf("unexpected number of events submitted: %d", len(fp.submitted))
}
if fp.submitted[0].Repository.Name != "ghcr.io/DingGGu/UtaiteBOX" {
t.Errorf("expected ghcr.io/DingGGu/UtaiteBOX but got %s", fp.submitted[0].Repository.Name)
}
if fp.submitted[0].Repository.Tag != "1.2.3" {
t.Errorf("expected 1.2.3 but got %s", fp.submitted[0].Repository.Tag)
}
}
func TestGithubContainerRegistryWebhookHandler(t *testing.T) {
fp := &fakeProvider{}
srv, teardown := NewTestingServer(fp)
defer teardown()
req, err := http.NewRequest("POST", "/v1/webhooks/github", bytes.NewBuffer([]byte(fakeGithubContainerRegistryWebhook)))
if err != nil {
t.Fatalf("failed to create req: %s", err)
}
req.Header.Set("X-GitHub-Event", "package")
//The response recorder used to record HTTP responses
rec := httptest.NewRecorder()
srv.router.ServeHTTP(rec, req)
if rec.Code != 200 {
t.Errorf("unexpected status code: %d", rec.Code)
t.Log(rec.Body.String())
}
if len(fp.submitted) != 1 {
t.Fatalf("unexpected number of events submitted: %d", len(fp.submitted))
}
if fp.submitted[0].Repository.Name != "ghcr.io/utaitebox/utaitebox-server" {
t.Errorf("expected ghcr.io/utaitebox/utaitebox-server but got %s", fp.submitted[0].Repository.Name)
}
if fp.submitted[0].Repository.Tag != "3.2.1" {
t.Errorf("expected 3.2.1 but got %s", fp.submitted[0].Repository.Tag)
}
}