// Copyright 2016 The go-github AUTHORS. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package github import ( "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestAppsService_Get_authenticatedApp(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/app", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1}`) }) ctx := t.Context() app, _, err := client.Apps.Get(ctx, "") if err != nil { t.Errorf("Apps.Get returned error: %v", err) } want := &App{ID: new(int64(1))} if !cmp.Equal(app, want) { t.Errorf("Apps.Get returned %+v, want %+v", app, want) } const methodName = "Get" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.Get(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.Get(ctx, "") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_Get_specifiedApp(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/apps/a", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"html_url":"https://github.com/apps/a"}`) }) ctx := t.Context() app, _, err := client.Apps.Get(ctx, "a") if err != nil { t.Errorf("Apps.Get returned error: %v", err) } want := &App{HTMLURL: new("https://github.com/apps/a")} if !cmp.Equal(app, want) { t.Errorf("Apps.Get returned %+v, want %+v", *app.HTMLURL, *want.HTMLURL) } } func TestAppsService_ListInstallationRequests(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/app/installation-requests", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "1", "per_page": "2", }) fmt.Fprint(w, `[{ "id": 1, "account": { "id": 2 }, "requester": { "id": 3 }, "created_at": `+referenceTimeStr+` }]`, ) }) opt := &ListOptions{Page: 1, PerPage: 2} ctx := t.Context() installationRequests, _, err := client.Apps.ListInstallationRequests(ctx, opt) if err != nil { t.Errorf("Apps.ListInstallationRequests returned error: %v", err) } want := []*InstallationRequest{{ ID: new(int64(1)), Account: &User{ID: new(int64(2))}, Requester: &User{ID: new(int64(3))}, CreatedAt: &referenceTimestamp, }} if !cmp.Equal(installationRequests, want) { t.Errorf("Apps.ListInstallationRequests returned %+v, want %+v", installationRequests, want) } const methodName = "ListInstallationRequests" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.ListInstallationRequests(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_ListInstallations(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/app/installations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "1", "per_page": "2", }) fmt.Fprint(w, `[{ "id":1, "app_id":1, "target_id":1, "target_type": "Organization", "permissions": { "actions": "read", "administration": "read", "checks": "read", "contents": "read", "content_references": "read", "deployments": "read", "environments": "read", "issues": "write", "metadata": "read", "members": "read", "organization_administration": "write", "organization_custom_roles": "write", "organization_hooks": "write", "organization_packages": "write", "organization_personal_access_tokens": "read", "organization_personal_access_token_requests": "read", "organization_plan": "read", "organization_pre_receive_hooks": "write", "organization_projects": "read", "organization_secrets": "read", "organization_self_hosted_runners": "read", "organization_user_blocking": "write", "packages": "read", "pages": "read", "pull_requests": "write", "repository_hooks": "write", "repository_projects": "read", "repository_pre_receive_hooks": "read", "secrets": "read", "secret_scanning_alerts": "read", "security_events": "read", "single_file": "write", "statuses": "write", "team_discussions": "read", "vulnerability_alerts": "read", "workflows": "write" }, "events": [ "push", "pull_request" ], "single_file_name": "config.yml", "repository_selection": "selected", "created_at": `+refTimeStr(1136178000)+`, "updated_at": `+refTimeStr(1136178001)+`}]`, ) }) opt := &ListOptions{Page: 1, PerPage: 2} ctx := t.Context() installations, _, err := client.Apps.ListInstallations(ctx, opt) if err != nil { t.Errorf("Apps.ListInstallations returned error: %v", err) } want := []*Installation{{ ID: new(int64(1)), AppID: new(int64(1)), TargetID: new(int64(1)), TargetType: new("Organization"), SingleFileName: new("config.yml"), RepositorySelection: new("selected"), Permissions: &InstallationPermissions{ Actions: new("read"), Administration: new("read"), Checks: new("read"), Contents: new("read"), ContentReferences: new("read"), Deployments: new("read"), Environments: new("read"), Issues: new("write"), Metadata: new("read"), Members: new("read"), OrganizationAdministration: new("write"), OrganizationCustomRoles: new("write"), OrganizationHooks: new("write"), OrganizationPackages: new("write"), OrganizationPersonalAccessTokens: new("read"), OrganizationPersonalAccessTokenRequests: new("read"), OrganizationPlan: new("read"), OrganizationPreReceiveHooks: new("write"), OrganizationProjects: new("read"), OrganizationSecrets: new("read"), OrganizationSelfHostedRunners: new("read"), OrganizationUserBlocking: new("write"), Packages: new("read"), Pages: new("read"), PullRequests: new("write"), RepositoryHooks: new("write"), RepositoryProjects: new("read"), RepositoryPreReceiveHooks: new("read"), Secrets: new("read"), SecretScanningAlerts: new("read"), SecurityEvents: new("read"), SingleFile: new("write"), Statuses: new("write"), TeamDiscussions: new("read"), VulnerabilityAlerts: new("read"), Workflows: new("write"), }, Events: []string{"push", "pull_request"}, CreatedAt: refTimestamp(1136178000), UpdatedAt: refTimestamp(1136178001), }} if !cmp.Equal(installations, want) { t.Errorf("Apps.ListInstallations returned %+v, want %+v", installations, want) } const methodName = "ListInstallations" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.ListInstallations(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_GetInstallation(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/app/installations/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1, "app_id":1, "target_id":1, "target_type": "Organization"}`) }) ctx := t.Context() installation, _, err := client.Apps.GetInstallation(ctx, 1) if err != nil { t.Errorf("Apps.GetInstallation returned error: %v", err) } want := &Installation{ID: new(int64(1)), AppID: new(int64(1)), TargetID: new(int64(1)), TargetType: new("Organization")} if !cmp.Equal(installation, want) { t.Errorf("Apps.GetInstallation returned %+v, want %+v", installation, want) } const methodName = "GetInstallation" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.GetInstallation(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.GetInstallation(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_ListUserInstallations(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/user/installations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "1", "per_page": "2", }) fmt.Fprint(w, `{"installations":[{"id":1, "app_id":1, "target_id":1, "target_type": "Organization"}]}`) }) opt := &ListOptions{Page: 1, PerPage: 2} ctx := t.Context() installations, _, err := client.Apps.ListUserInstallations(ctx, opt) if err != nil { t.Errorf("Apps.ListUserInstallations returned error: %v", err) } want := []*Installation{{ID: new(int64(1)), AppID: new(int64(1)), TargetID: new(int64(1)), TargetType: new("Organization")}} if !cmp.Equal(installations, want) { t.Errorf("Apps.ListUserInstallations returned %+v, want %+v", installations, want) } const methodName = "ListUserInstallations" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.ListUserInstallations(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_SuspendInstallation(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/app/installations/1/suspended", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") w.WriteHeader(http.StatusNoContent) }) ctx := t.Context() if _, err := client.Apps.SuspendInstallation(ctx, 1); err != nil { t.Errorf("Apps.SuspendInstallation returned error: %v", err) } const methodName = "SuspendInstallation" testBadOptions(t, methodName, func() (err error) { _, err = client.Apps.SuspendInstallation(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Apps.SuspendInstallation(ctx, 1) }) } func TestAppsService_UnsuspendInstallation(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/app/installations/1/suspended", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := t.Context() if _, err := client.Apps.UnsuspendInstallation(ctx, 1); err != nil { t.Errorf("Apps.UnsuspendInstallation returned error: %v", err) } const methodName = "UnsuspendInstallation" testBadOptions(t, methodName, func() (err error) { _, err = client.Apps.UnsuspendInstallation(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Apps.UnsuspendInstallation(ctx, 1) }) } func TestAppsService_DeleteInstallation(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/app/installations/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusAccepted) }) ctx := t.Context() _, err := client.Apps.DeleteInstallation(ctx, 1) if err != nil { t.Errorf("Apps.DeleteInstallation returned error: %v", err) } const methodName = "DeleteInstallation" testBadOptions(t, methodName, func() (err error) { _, err = client.Apps.DeleteInstallation(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Apps.DeleteInstallation(ctx, 1) }) } func TestAppsService_DeleteInstallationNoContent(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/app/installations/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := t.Context() _, err := client.Apps.DeleteInstallation(ctx, 1) if err != nil { t.Errorf("Apps.DeleteInstallation returned error: %v", err) } } func TestAppsService_CreateInstallationToken(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/app/installations/1/access_tokens", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"token":"t"}`) }) ctx := t.Context() token, _, err := client.Apps.CreateInstallationToken(ctx, 1, nil) if err != nil { t.Errorf("Apps.CreateInstallationToken returned error: %v", err) } want := &InstallationToken{Token: new("t")} if !cmp.Equal(token, want) { t.Errorf("Apps.CreateInstallationToken returned %+v, want %+v", token, want) } const methodName = "CreateInstallationToken" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.CreateInstallationToken(ctx, -1, nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.CreateInstallationToken(ctx, 1, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_CreateInstallationTokenWithOptions(t *testing.T) { t.Parallel() client, mux, _ := setup(t) installationTokenOptions := &InstallationTokenOptions{ RepositoryIDs: []int64{1234}, Repositories: []string{"foo"}, Permissions: &InstallationPermissions{ Contents: new("write"), Issues: new("read"), }, } mux.HandleFunc("/app/installations/1/access_tokens", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testJSONBody(t, r, installationTokenOptions) fmt.Fprint(w, `{"token":"t"}`) }) ctx := t.Context() token, _, err := client.Apps.CreateInstallationToken(ctx, 1, installationTokenOptions) if err != nil { t.Errorf("Apps.CreateInstallationToken returned error: %v", err) } want := &InstallationToken{Token: new("t")} if !cmp.Equal(token, want) { t.Errorf("Apps.CreateInstallationToken returned %+v, want %+v", token, want) } } func TestAppsService_CreateInstallationTokenListReposWithOptions(t *testing.T) { t.Parallel() client, mux, _ := setup(t) installationTokenListRepoOptions := &InstallationTokenListRepoOptions{ Repositories: []string{"foo"}, Permissions: &InstallationPermissions{ Contents: new("write"), Issues: new("read"), }, } mux.HandleFunc("/app/installations/1/access_tokens", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testJSONBody(t, r, installationTokenListRepoOptions) fmt.Fprint(w, `{"token":"t"}`) }) ctx := t.Context() token, _, err := client.Apps.CreateInstallationTokenListRepos(ctx, 1, installationTokenListRepoOptions) if err != nil { t.Errorf("Apps.CreateInstallationTokenListRepos returned error: %v", err) } want := &InstallationToken{Token: new("t")} if !cmp.Equal(token, want) { t.Errorf("Apps.CreateInstallationTokenListRepos returned %+v, want %+v", token, want) } } func TestAppsService_CreateInstallationTokenListReposWithNoOptions(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/app/installations/1/access_tokens", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"token":"t"}`) }) ctx := t.Context() token, _, err := client.Apps.CreateInstallationTokenListRepos(ctx, 1, nil) if err != nil { t.Errorf("Apps.CreateInstallationTokenListRepos returned error: %v", err) } want := &InstallationToken{Token: new("t")} if !cmp.Equal(token, want) { t.Errorf("Apps.CreateInstallationTokenListRepos returned %+v, want %+v", token, want) } const methodName = "CreateInstallationTokenListRepos" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.CreateInstallationTokenListRepos(ctx, -1, nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.CreateInstallationTokenListRepos(ctx, 1, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_CreateAttachment(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/content_references/11/attachments", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeContentAttachmentsPreview) w.WriteHeader(http.StatusOK) assertWrite(t, w, []byte(`{"id":1,"title":"title1","body":"body1"}`)) }) ctx := t.Context() got, _, err := client.Apps.CreateAttachment(ctx, 11, "title1", "body1") if err != nil { t.Errorf("CreateAttachment returned error: %v", err) } want := &Attachment{ID: new(int64(1)), Title: new("title1"), Body: new("body1")} if !cmp.Equal(got, want) { t.Errorf("CreateAttachment = %+v, want %+v", got, want) } const methodName = "CreateAttachment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.CreateAttachment(ctx, -11, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.CreateAttachment(ctx, 11, "title1", "body1") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_GetOrganizationInstallation(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/orgs/o/installation", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1, "app_id":1, "target_id":1, "target_type": "Organization"}`) }) ctx := t.Context() installation, _, err := client.Apps.GetOrganizationInstallation(ctx, "o") if err != nil { t.Errorf("Apps.GetOrganizationInstallation returned error: %v", err) } want := &Installation{ID: new(int64(1)), AppID: new(int64(1)), TargetID: new(int64(1)), TargetType: new("Organization")} if !cmp.Equal(installation, want) { t.Errorf("Apps.GetOrganizationInstallation returned %+v, want %+v", installation, want) } const methodName = "GetOrganizationInstallation" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.GetOrganizationInstallation(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.GetOrganizationInstallation(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_GetEnterpriseInstallation(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/enterprises/e/installation", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1, "app_id":1, "target_id":1, "target_type": "Enterprise"}`) }) ctx := t.Context() installation, _, err := client.Apps.GetEnterpriseInstallation(ctx, "e") if err != nil { t.Errorf("Apps.GetEnterpriseInstallation returned error: %v", err) } want := &Installation{ID: new(int64(1)), AppID: new(int64(1)), TargetID: new(int64(1)), TargetType: new("Enterprise")} if !cmp.Equal(installation, want) { t.Errorf("Apps.GetEnterpriseInstallation returned %+v, want %+v", installation, want) } const methodName = "GetEnterpriseInstallation" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.GetEnterpriseInstallation(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.GetEnterpriseInstallation(ctx, "e") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_GetRepositoryInstallation(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/repos/o/r/installation", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1, "app_id":1, "target_id":1, "target_type": "Organization"}`) }) ctx := t.Context() installation, _, err := client.Apps.GetRepositoryInstallation(ctx, "o", "r") if err != nil { t.Errorf("Apps.GetRepositoryInstallation returned error: %v", err) } want := &Installation{ID: new(int64(1)), AppID: new(int64(1)), TargetID: new(int64(1)), TargetType: new("Organization")} if !cmp.Equal(installation, want) { t.Errorf("Apps.GetRepositoryInstallation returned %+v, want %+v", installation, want) } const methodName = "GetRepositoryInstallation" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.GetRepositoryInstallation(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.GetRepositoryInstallation(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_GetRepositoryInstallationByID(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/repositories/1/installation", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1, "app_id":1, "target_id":1, "target_type": "Organization"}`) }) ctx := t.Context() installation, _, err := client.Apps.GetRepositoryInstallationByID(ctx, 1) if err != nil { t.Errorf("Apps.GetRepositoryInstallationByID returned error: %v", err) } want := &Installation{ID: new(int64(1)), AppID: new(int64(1)), TargetID: new(int64(1)), TargetType: new("Organization")} if !cmp.Equal(installation, want) { t.Errorf("Apps.GetRepositoryInstallationByID returned %+v, want %+v", installation, want) } const methodName = "GetRepositoryInstallationByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.GetRepositoryInstallationByID(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.GetRepositoryInstallationByID(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_GetUserInstallation(t *testing.T) { t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/users/u/installation", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1, "app_id":1, "target_id":1, "target_type": "User"}`) }) ctx := t.Context() installation, _, err := client.Apps.GetUserInstallation(ctx, "u") if err != nil { t.Errorf("Apps.GetUserInstallation returned error: %v", err) } want := &Installation{ID: new(int64(1)), AppID: new(int64(1)), TargetID: new(int64(1)), TargetType: new("User")} if !cmp.Equal(installation, want) { t.Errorf("Apps.GetUserInstallation returned %+v, want %+v", installation, want) } const methodName = "GetUserInstallation" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.GetUserInstallation(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.GetUserInstallation(ctx, "u") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }