github.com/google/go-github/v74@v74.0.0/github/orgs_codesecurity_configurations_test.go (about)

     1  // Copyright 2024 The go-github AUTHORS. All rights reserved.
     2  //
     3  // Use of this source code is governed by a BSD-style
     4  // license that can be found in the LICENSE file.
     5  
     6  package github
     7  
     8  import (
     9  	"context"
    10  	"encoding/json"
    11  	"fmt"
    12  	"net/http"
    13  	"reflect"
    14  	"testing"
    15  )
    16  
    17  func TestOrganizationsService_GetCodeSecurityConfigurations(t *testing.T) {
    18  	t.Parallel()
    19  	ctx := context.Background()
    20  	client, mux, _ := setup(t)
    21  
    22  	mux.HandleFunc("/orgs/o/code-security/configurations", func(w http.ResponseWriter, r *http.Request) {
    23  		testMethod(t, r, "GET")
    24  		fmt.Fprint(w, `[
    25  		{
    26  			"id":1,
    27  			"name":"config1",
    28  			"code_scanning_default_setup": "enabled"
    29  		},
    30  		{
    31  			"id":2,
    32  			"name":"config2",
    33  			"private_vulnerability_reporting": "enabled"
    34  		}]`)
    35  	})
    36  
    37  	configurations, _, err := client.Organizations.GetCodeSecurityConfigurations(ctx, "o")
    38  	if err != nil {
    39  		t.Errorf("Organizations.GetOrganizationCodeSecurityConfigurations returned error: %v", err)
    40  	}
    41  
    42  	want := []*CodeSecurityConfiguration{
    43  		{ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled")},
    44  		{ID: Ptr(int64(2)), Name: Ptr("config2"), PrivateVulnerabilityReporting: Ptr("enabled")},
    45  	}
    46  	if !reflect.DeepEqual(configurations, want) {
    47  		t.Errorf("Organizations.GetCodeSecurityConfigurations returned %+v, want %+v", configurations, want)
    48  	}
    49  	const methodName = "GetCodeSecurityConfigurations"
    50  	testBadOptions(t, methodName, func() (err error) {
    51  		_, _, err = client.Organizations.GetCodeSecurityConfigurations(ctx, "\n")
    52  		return err
    53  	})
    54  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
    55  		got, resp, err := client.Organizations.GetCodeSecurityConfigurations(ctx, "o")
    56  		if got != nil {
    57  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
    58  		}
    59  		return resp, err
    60  	})
    61  }
    62  
    63  func TestOrganizationsService_GetCodeSecurityConfiguration(t *testing.T) {
    64  	t.Parallel()
    65  	client, mux, _ := setup(t)
    66  	ctx := context.Background()
    67  
    68  	mux.HandleFunc("/orgs/o/code-security/configurations/1", func(w http.ResponseWriter, r *http.Request) {
    69  		testMethod(t, r, "GET")
    70  		fmt.Fprint(w, `{
    71  			"id":1,
    72  			"name":"config1",
    73  			"code_scanning_default_setup": "enabled"
    74  		}`)
    75  	})
    76  
    77  	configuration, _, err := client.Organizations.GetCodeSecurityConfiguration(ctx, "o", 1)
    78  	if err != nil {
    79  		t.Errorf("Organizations.GetCodeSecurityConfiguration returned error: %v", err)
    80  	}
    81  
    82  	want := &CodeSecurityConfiguration{ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled")}
    83  	if !reflect.DeepEqual(configuration, want) {
    84  		t.Errorf("Organizations.GetCodeSecurityConfiguration returned %+v, want %+v", configuration, want)
    85  	}
    86  
    87  	const methodName = "GetCodeSecurityConfiguration"
    88  	testBadOptions(t, methodName, func() (err error) {
    89  		_, _, err = client.Organizations.GetCodeSecurityConfiguration(ctx, "\n", -1)
    90  		return err
    91  	})
    92  
    93  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
    94  		got, resp, err := client.Organizations.GetCodeSecurityConfiguration(ctx, "o", 1)
    95  		if got != nil {
    96  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
    97  		}
    98  		return resp, err
    99  	})
   100  }
   101  
   102  func TestOrganizationsService_CreateCodeSecurityConfiguration(t *testing.T) {
   103  	t.Parallel()
   104  	client, mux, _ := setup(t)
   105  	ctx := context.Background()
   106  
   107  	input := &CodeSecurityConfiguration{
   108  		Name:                     Ptr("config1"),
   109  		CodeScanningDefaultSetup: Ptr("enabled"),
   110  	}
   111  
   112  	mux.HandleFunc("/orgs/o/code-security/configurations", func(w http.ResponseWriter, r *http.Request) {
   113  		v := new(CodeSecurityConfiguration)
   114  		assertNilError(t, json.NewDecoder(r.Body).Decode(v))
   115  
   116  		if !reflect.DeepEqual(v, input) {
   117  			t.Errorf("Organizations.CreateCodeSecurityConfiguration request body = %+v, want %+v", v, input)
   118  		}
   119  
   120  		fmt.Fprint(w, `{
   121  			"id":1,
   122  			"name":"config1",
   123  			"code_scanning_default_setup": "enabled"
   124  		}`)
   125  	})
   126  
   127  	configuration, _, err := client.Organizations.CreateCodeSecurityConfiguration(ctx, "o", input)
   128  	if err != nil {
   129  		t.Errorf("Organizations.CreateCodeSecurityConfiguration returned error: %v", err)
   130  	}
   131  
   132  	want := &CodeSecurityConfiguration{ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled")}
   133  	if !reflect.DeepEqual(configuration, want) {
   134  		t.Errorf("Organizations.CreateCodeSecurityConfiguration returned %+v, want %+v", configuration, want)
   135  	}
   136  
   137  	const methodName = "CreateCodeSecurityConfiguration"
   138  	testBadOptions(t, methodName, func() (err error) {
   139  		_, _, err = client.Organizations.CreateCodeSecurityConfiguration(ctx, "\n", input)
   140  		return err
   141  	})
   142  
   143  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   144  		got, resp, err := client.Organizations.CreateCodeSecurityConfiguration(ctx, "o", input)
   145  		if got != nil {
   146  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   147  		}
   148  		return resp, err
   149  	})
   150  }
   151  
   152  func TestOrganizationsService_GetDefaultCodeSecurityConfigurations(t *testing.T) {
   153  	t.Parallel()
   154  	client, mux, _ := setup(t)
   155  	ctx := context.Background()
   156  
   157  	mux.HandleFunc("/orgs/o/code-security/configurations/defaults", func(w http.ResponseWriter, r *http.Request) {
   158  		testMethod(t, r, "GET")
   159  		fmt.Fprint(w, `[
   160  		{
   161  			"id":1,
   162  			"name":"config1",
   163  			"code_scanning_default_setup": "enabled"
   164  		},
   165  		{
   166  			"id":2,
   167  			"name":"config2",
   168  			"private_vulnerability_reporting": "enabled"
   169  		}]`)
   170  	})
   171  
   172  	configurations, _, err := client.Organizations.GetDefaultCodeSecurityConfigurations(ctx, "o")
   173  	if err != nil {
   174  		t.Errorf("Organizations.GetDefaultCodeSecurityConfigurations returned error: %v", err)
   175  	}
   176  
   177  	want := []*CodeSecurityConfiguration{
   178  		{ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled")},
   179  		{ID: Ptr(int64(2)), Name: Ptr("config2"), PrivateVulnerabilityReporting: Ptr("enabled")},
   180  	}
   181  	if !reflect.DeepEqual(configurations, want) {
   182  		t.Errorf("Organizations.GetDefaultCodeSecurityConfigurations returned %+v, want %+v", configurations, want)
   183  	}
   184  
   185  	const methodName = "GetDefaultCodeSecurityConfigurations"
   186  	testBadOptions(t, methodName, func() (err error) {
   187  		_, _, err = client.Organizations.GetDefaultCodeSecurityConfigurations(ctx, "\n")
   188  		return err
   189  	})
   190  
   191  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   192  		got, resp, err := client.Organizations.GetDefaultCodeSecurityConfigurations(ctx, "o")
   193  		if got != nil {
   194  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   195  		}
   196  		return resp, err
   197  	})
   198  }
   199  
   200  func TestOrganizationsService_DetachCodeSecurityConfigurationsFromRepositories(t *testing.T) {
   201  	t.Parallel()
   202  	client, mux, _ := setup(t)
   203  	ctx := context.Background()
   204  
   205  	mux.HandleFunc("/orgs/o/code-security/configurations/detach", func(w http.ResponseWriter, r *http.Request) {
   206  		testMethod(t, r, "DELETE")
   207  		w.WriteHeader(http.StatusNoContent)
   208  	})
   209  
   210  	resp, err := client.Organizations.DetachCodeSecurityConfigurationsFromRepositories(ctx, "o", []int64{1})
   211  	if err != nil {
   212  		t.Errorf("Organizations.DetachCodeSecurityConfigurationsFromRepositories returned error: %v", err)
   213  	}
   214  
   215  	want := http.StatusNoContent
   216  	if resp.StatusCode != want {
   217  		t.Errorf("Organizations.DetachCodeSecurityConfigurationsFromRepositories returned status %d, want %d", resp.StatusCode, want)
   218  	}
   219  
   220  	const methodName = "DetachCodeSecurityConfigurationsFromRepositories"
   221  	testBadOptions(t, methodName, func() (err error) {
   222  		_, err = client.Organizations.DetachCodeSecurityConfigurationsFromRepositories(ctx, "\n", []int64{1})
   223  		return err
   224  	})
   225  
   226  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   227  		resp, err := client.Organizations.DetachCodeSecurityConfigurationsFromRepositories(ctx, "o", []int64{1})
   228  		return resp, err
   229  	})
   230  }
   231  
   232  func TestOrganizationsService_UpdateCodeSecurityConfiguration(t *testing.T) {
   233  	t.Parallel()
   234  	ctx := context.Background()
   235  	client, mux, _ := setup(t)
   236  
   237  	input := &CodeSecurityConfiguration{
   238  		Name:                     Ptr("config1"),
   239  		CodeScanningDefaultSetup: Ptr("enabled"),
   240  	}
   241  
   242  	mux.HandleFunc("/orgs/o/code-security/configurations/1", func(w http.ResponseWriter, r *http.Request) {
   243  		v := new(CodeSecurityConfiguration)
   244  		assertNilError(t, json.NewDecoder(r.Body).Decode(v))
   245  
   246  		if !reflect.DeepEqual(v, input) {
   247  			t.Errorf("Organizations.UpdateCodeSecurityConfiguration request body = %+v, want %+v", v, input)
   248  		}
   249  
   250  		fmt.Fprint(w, `{
   251  			"id":1,
   252  			"name":"config1",
   253  			"code_scanning_default_setup": "enabled"
   254  		}`)
   255  	})
   256  
   257  	configuration, _, err := client.Organizations.UpdateCodeSecurityConfiguration(ctx, "o", 1, input)
   258  	if err != nil {
   259  		t.Errorf("Organizations.UpdateCodeSecurityConfiguration returned error: %v", err)
   260  	}
   261  
   262  	want := &CodeSecurityConfiguration{ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled")}
   263  	if !reflect.DeepEqual(configuration, want) {
   264  		t.Errorf("Organizations.UpdateCodeSecurityConfiguration returned %+v, want %+v", configuration, want)
   265  	}
   266  
   267  	const methodName = "UpdateCodeSecurityConfiguration"
   268  	testBadOptions(t, methodName, func() (err error) {
   269  		_, _, err = client.Organizations.UpdateCodeSecurityConfiguration(ctx, "\n", -1, input)
   270  		return
   271  	})
   272  
   273  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   274  		got, resp, err := client.Organizations.UpdateCodeSecurityConfiguration(ctx, "o", 1, input)
   275  		if got != nil {
   276  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   277  		}
   278  		return resp, err
   279  	})
   280  }
   281  
   282  func TestOrganizationsService_DeleteCodeSecurityConfiguration(t *testing.T) {
   283  	t.Parallel()
   284  	ctx := context.Background()
   285  	client, mux, _ := setup(t)
   286  
   287  	mux.HandleFunc("/orgs/o/code-security/configurations/1", func(w http.ResponseWriter, r *http.Request) {
   288  		testMethod(t, r, "DELETE")
   289  		w.WriteHeader(http.StatusNoContent)
   290  	})
   291  
   292  	resp, err := client.Organizations.DeleteCodeSecurityConfiguration(ctx, "o", 1)
   293  	if err != nil {
   294  		t.Errorf("Organizations.DeleteCodeSecurityConfiguration returned error: %v", err)
   295  	}
   296  
   297  	want := http.StatusNoContent
   298  	if resp.StatusCode != want {
   299  		t.Errorf("Organizations.DeleteCodeSecurityConfiguration returned status %d, want %d", resp.StatusCode, want)
   300  	}
   301  
   302  	const methodName = "DeleteCodeSecurityConfiguration"
   303  	testBadOptions(t, methodName, func() (err error) {
   304  		_, err = client.Organizations.DeleteCodeSecurityConfiguration(ctx, "\n", -1)
   305  		return
   306  	})
   307  
   308  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   309  		resp, err := client.Organizations.DeleteCodeSecurityConfiguration(ctx, "o", 1)
   310  		return resp, err
   311  	})
   312  }
   313  
   314  func TestOrganizationsService_AttachCodeSecurityConfigurationsToRepositories(t *testing.T) {
   315  	t.Parallel()
   316  	ctx := context.Background()
   317  	client, mux, _ := setup(t)
   318  
   319  	mux.HandleFunc("/orgs/o/code-security/configurations/1/attach", func(w http.ResponseWriter, r *http.Request) {
   320  		testMethod(t, r, "POST")
   321  		type request struct {
   322  			Scope                 string  `json:"scope"`
   323  			SelectedRepositoryIDs []int64 `json:"selected_repository_ids,omitempty"`
   324  		}
   325  		v := new(request)
   326  		assertNilError(t, json.NewDecoder(r.Body).Decode(v))
   327  		if v.Scope != "selected" {
   328  			t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories request body scope = %s, want selected", v.Scope)
   329  		}
   330  		if !reflect.DeepEqual(v.SelectedRepositoryIDs, []int64{5, 20}) {
   331  			t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories request body selected_repository_ids = %+v, want %+v", v.SelectedRepositoryIDs, []int64{5, 20})
   332  		}
   333  		w.WriteHeader(http.StatusAccepted)
   334  	})
   335  
   336  	resp, err := client.Organizations.AttachCodeSecurityConfigurationsToRepositories(ctx, "o", int64(1), "selected", []int64{5, 20})
   337  	if err != nil {
   338  		t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories returned error: %v", err)
   339  	}
   340  
   341  	want := http.StatusAccepted
   342  	if resp.StatusCode != want {
   343  		t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories returned status %d, want %d", resp.StatusCode, want)
   344  	}
   345  
   346  	const methodName = "AttachCodeSecurityConfigurationsToRepositories"
   347  	testBadOptions(t, methodName, func() (err error) {
   348  		_, err = client.Organizations.AttachCodeSecurityConfigurationsToRepositories(ctx, "\n", -1, "", nil)
   349  		return
   350  	})
   351  
   352  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   353  		resp, err := client.Organizations.AttachCodeSecurityConfigurationsToRepositories(ctx, "o", 1, "selected", []int64{5, 20})
   354  		return resp, err
   355  	})
   356  }
   357  
   358  func TestOrganizationsService_SetDefaultCodeSecurityConfiguration(t *testing.T) {
   359  	t.Parallel()
   360  	ctx := context.Background()
   361  	client, mux, _ := setup(t)
   362  
   363  	mux.HandleFunc("/orgs/o/code-security/configurations/1/defaults", func(w http.ResponseWriter, r *http.Request) {
   364  		testMethod(t, r, "PUT")
   365  		fmt.Fprint(w, `
   366  		{
   367  			"default_for_new_repos": "all",
   368  			"configuration":
   369  				{
   370  					"id": 1,
   371  					"name": "config1",
   372  					"code_scanning_default_setup": "enabled"
   373  				}
   374  		}`)
   375  	})
   376  	got, resp, err := client.Organizations.SetDefaultCodeSecurityConfiguration(ctx, "o", 1, "all")
   377  	if err != nil {
   378  		t.Errorf("Organizations.SetDefaultCodeSecurityConfiguration returned error: %v", err)
   379  	}
   380  	wantStatus := http.StatusOK
   381  	if resp.StatusCode != wantStatus {
   382  		t.Errorf("Organizations.SetDefaultCodeSecurityConfiguration returned status %d, want %d", resp.StatusCode, wantStatus)
   383  	}
   384  	want := &CodeSecurityConfigurationWithDefaultForNewRepos{
   385  		DefaultForNewRepos: Ptr("all"),
   386  		Configuration: &CodeSecurityConfiguration{
   387  			ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled"),
   388  		},
   389  	}
   390  	if !reflect.DeepEqual(got, want) {
   391  		t.Errorf("Organizations.SetDefaultCodeSecurityConfiguration returned %+v, want %+v", got, want)
   392  	}
   393  
   394  	const methodName = "SetDefaultCodeSecurityConfiguration"
   395  	testBadOptions(t, methodName, func() (err error) {
   396  		_, _, err = client.Organizations.SetDefaultCodeSecurityConfiguration(ctx, "\n", -1, "")
   397  		return
   398  	})
   399  
   400  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   401  		got, resp, err := client.Organizations.SetDefaultCodeSecurityConfiguration(ctx, "o", 1, "all")
   402  		if got != nil {
   403  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   404  		}
   405  		return resp, err
   406  	})
   407  }
   408  
   409  func TestOrganizationsService_GetRepositoriesForCodeSecurityConfiguration(t *testing.T) {
   410  	t.Parallel()
   411  	ctx := context.Background()
   412  	client, mux, _ := setup(t)
   413  
   414  	mux.HandleFunc("/orgs/o/code-security/configurations/1/repositories", func(w http.ResponseWriter, r *http.Request) {
   415  		testMethod(t, r, "GET")
   416  		fmt.Fprint(w, `[
   417  		{
   418  			"id":8,
   419  			"name":"repo8"
   420  		},
   421  		{
   422  			"id":42,
   423  			"name":"repo42"
   424  		}]`)
   425  	})
   426  
   427  	repositories, _, err := client.Organizations.GetRepositoriesForCodeSecurityConfiguration(ctx, "o", 1)
   428  	if err != nil {
   429  		t.Errorf("Organizations.GetRepositoriesForCodeSecurityConfiguration returned error: %v", err)
   430  	}
   431  
   432  	want := []*Repository{
   433  		{ID: Ptr(int64(8)), Name: Ptr("repo8")},
   434  		{ID: Ptr(int64(42)), Name: Ptr("repo42")},
   435  	}
   436  	if !reflect.DeepEqual(repositories, want) {
   437  		t.Errorf("Organizations.GetRepositoriesForCodeSecurityConfiguration returned %+v, want %+v", repositories, want)
   438  	}
   439  
   440  	const methodName = "GetRepositoriesForCodeSecurityConfiguration"
   441  	testBadOptions(t, methodName, func() (err error) {
   442  		_, _, err = client.Organizations.GetRepositoriesForCodeSecurityConfiguration(ctx, "\n", -1)
   443  		return
   444  	})
   445  
   446  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   447  		got, resp, err := client.Organizations.GetRepositoriesForCodeSecurityConfiguration(ctx, "o", 1)
   448  		if got != nil {
   449  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   450  		}
   451  		return resp, err
   452  	})
   453  }
   454  
   455  func TestOrganizationsService_GetCodeSecurityConfigurationForRepository(t *testing.T) {
   456  	t.Parallel()
   457  	ctx := context.Background()
   458  	client, mux, _ := setup(t)
   459  
   460  	mux.HandleFunc("/repos/o/repo8/code-security-configuration", func(w http.ResponseWriter, r *http.Request) {
   461  		testMethod(t, r, "GET")
   462  		fmt.Fprint(w, `{
   463  		    "state": "attached",
   464  			"configuration": {
   465  				"id":42,
   466  				"name":"config42",
   467  				"code_scanning_default_setup": "enabled"
   468  			}
   469  		}`)
   470  	})
   471  
   472  	rc, _, err := client.Organizations.GetCodeSecurityConfigurationForRepository(ctx, "o", "repo8")
   473  	if err != nil {
   474  		t.Errorf("Organizations.GetCodeSecurityConfigurationForRepository returned error: %v", err)
   475  	}
   476  	c := &CodeSecurityConfiguration{ID: Ptr(int64(42)), Name: Ptr("config42"), CodeScanningDefaultSetup: Ptr("enabled")}
   477  	want := &RepositoryCodeSecurityConfiguration{
   478  		State:         Ptr("attached"),
   479  		Configuration: c,
   480  	}
   481  	if !reflect.DeepEqual(rc, want) {
   482  		t.Errorf("Organizations.GetCodeSecurityConfigurationForRepository returned %+v, want %+v", rc, want)
   483  	}
   484  
   485  	const methodName = "GetCodeSecurityConfigurationForRepository"
   486  	testBadOptions(t, methodName, func() (err error) {
   487  		_, _, err = client.Organizations.GetCodeSecurityConfigurationForRepository(ctx, "\n", "\n")
   488  		return
   489  	})
   490  
   491  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   492  		got, resp, err := client.Organizations.GetCodeSecurityConfigurationForRepository(ctx, "o", "repo8")
   493  		if got != nil {
   494  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   495  		}
   496  		return resp, err
   497  	})
   498  }