github.com/google/go-github/v69@v69.2.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  		err := json.NewDecoder(r.Body).Decode(v)
   115  		if err != nil {
   116  			t.Errorf("Organizations.CreateCodeSecurityConfiguration request body decode failed: %v", err)
   117  		}
   118  
   119  		if !reflect.DeepEqual(v, input) {
   120  			t.Errorf("Organizations.CreateCodeSecurityConfiguration request body = %+v, want %+v", v, input)
   121  		}
   122  
   123  		fmt.Fprint(w, `{
   124  			"id":1,
   125  			"name":"config1",
   126  			"code_scanning_default_setup": "enabled"
   127  		}`)
   128  	})
   129  
   130  	configuration, _, err := client.Organizations.CreateCodeSecurityConfiguration(ctx, "o", input)
   131  	if err != nil {
   132  		t.Errorf("Organizations.CreateCodeSecurityConfiguration returned error: %v", err)
   133  	}
   134  
   135  	want := &CodeSecurityConfiguration{ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled")}
   136  	if !reflect.DeepEqual(configuration, want) {
   137  		t.Errorf("Organizations.CreateCodeSecurityConfiguration returned %+v, want %+v", configuration, want)
   138  	}
   139  
   140  	const methodName = "CreateCodeSecurityConfiguration"
   141  	testBadOptions(t, methodName, func() (err error) {
   142  		_, _, err = client.Organizations.CreateCodeSecurityConfiguration(ctx, "\n", input)
   143  		return err
   144  	})
   145  
   146  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   147  		got, resp, err := client.Organizations.CreateCodeSecurityConfiguration(ctx, "o", input)
   148  		if got != nil {
   149  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   150  		}
   151  		return resp, err
   152  	})
   153  }
   154  
   155  func TestOrganizationsService_GetDefaultCodeSecurityConfigurations(t *testing.T) {
   156  	t.Parallel()
   157  	client, mux, _ := setup(t)
   158  	ctx := context.Background()
   159  
   160  	mux.HandleFunc("/orgs/o/code-security/configurations/defaults", func(w http.ResponseWriter, r *http.Request) {
   161  		testMethod(t, r, "GET")
   162  		fmt.Fprint(w, `[
   163  		{
   164  			"id":1,
   165  			"name":"config1",
   166  			"code_scanning_default_setup": "enabled"
   167  		},
   168  		{
   169  			"id":2,
   170  			"name":"config2",
   171  			"private_vulnerability_reporting": "enabled"
   172  		}]`)
   173  	})
   174  
   175  	configurations, _, err := client.Organizations.GetDefaultCodeSecurityConfigurations(ctx, "o")
   176  	if err != nil {
   177  		t.Errorf("Organizations.GetDefaultCodeSecurityConfigurations returned error: %v", err)
   178  	}
   179  
   180  	want := []*CodeSecurityConfiguration{
   181  		{ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled")},
   182  		{ID: Ptr(int64(2)), Name: Ptr("config2"), PrivateVulnerabilityReporting: Ptr("enabled")},
   183  	}
   184  	if !reflect.DeepEqual(configurations, want) {
   185  		t.Errorf("Organizations.GetDefaultCodeSecurityConfigurations returned %+v, want %+v", configurations, want)
   186  	}
   187  
   188  	const methodName = "GetDefaultCodeSecurityConfigurations"
   189  	testBadOptions(t, methodName, func() (err error) {
   190  		_, _, err = client.Organizations.GetDefaultCodeSecurityConfigurations(ctx, "\n")
   191  		return err
   192  	})
   193  
   194  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   195  		got, resp, err := client.Organizations.GetDefaultCodeSecurityConfigurations(ctx, "o")
   196  		if got != nil {
   197  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   198  		}
   199  		return resp, err
   200  	})
   201  }
   202  
   203  func TestOrganizationsService_DetachCodeSecurityConfigurationsFromRepositories(t *testing.T) {
   204  	t.Parallel()
   205  	client, mux, _ := setup(t)
   206  	ctx := context.Background()
   207  
   208  	mux.HandleFunc("/orgs/o/code-security/configurations/detach", func(w http.ResponseWriter, r *http.Request) {
   209  		testMethod(t, r, "DELETE")
   210  		w.WriteHeader(http.StatusNoContent)
   211  	})
   212  
   213  	resp, err := client.Organizations.DetachCodeSecurityConfigurationsFromRepositories(ctx, "o", []int64{1})
   214  	if err != nil {
   215  		t.Errorf("Organizations.DetachCodeSecurityConfigurationsFromRepositories returned error: %v", err)
   216  	}
   217  
   218  	want := http.StatusNoContent
   219  	if resp.StatusCode != want {
   220  		t.Errorf("Organizations.DetachCodeSecurityConfigurationsFromRepositories returned status %d, want %d", resp.StatusCode, want)
   221  	}
   222  
   223  	const methodName = "DetachCodeSecurityConfigurationsFromRepositories"
   224  	testBadOptions(t, methodName, func() (err error) {
   225  		_, err = client.Organizations.DetachCodeSecurityConfigurationsFromRepositories(ctx, "\n", []int64{1})
   226  		return err
   227  	})
   228  
   229  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   230  		resp, err := client.Organizations.DetachCodeSecurityConfigurationsFromRepositories(ctx, "o", []int64{1})
   231  		return resp, err
   232  	})
   233  }
   234  
   235  func TestOrganizationsService_UpdateCodeSecurityConfiguration(t *testing.T) {
   236  	t.Parallel()
   237  	ctx := context.Background()
   238  	client, mux, _ := setup(t)
   239  
   240  	input := &CodeSecurityConfiguration{
   241  		Name:                     Ptr("config1"),
   242  		CodeScanningDefaultSetup: Ptr("enabled"),
   243  	}
   244  
   245  	mux.HandleFunc("/orgs/o/code-security/configurations/1", func(w http.ResponseWriter, r *http.Request) {
   246  		v := new(CodeSecurityConfiguration)
   247  		err := json.NewDecoder(r.Body).Decode(v)
   248  		if err != nil {
   249  			t.Errorf("Organizations.UpdateCodeSecurityConfiguration request body decode failed: %v", err)
   250  		}
   251  
   252  		if !reflect.DeepEqual(v, input) {
   253  			t.Errorf("Organizations.UpdateCodeSecurityConfiguration request body = %+v, want %+v", v, input)
   254  		}
   255  
   256  		fmt.Fprint(w, `{
   257  			"id":1,
   258  			"name":"config1",
   259  			"code_scanning_default_setup": "enabled"
   260  		}`)
   261  	})
   262  
   263  	configuration, _, err := client.Organizations.UpdateCodeSecurityConfiguration(ctx, "o", 1, input)
   264  	if err != nil {
   265  		t.Errorf("Organizations.UpdateCodeSecurityConfiguration returned error: %v", err)
   266  	}
   267  
   268  	want := &CodeSecurityConfiguration{ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled")}
   269  	if !reflect.DeepEqual(configuration, want) {
   270  		t.Errorf("Organizations.UpdateCodeSecurityConfiguration returned %+v, want %+v", configuration, want)
   271  	}
   272  
   273  	const methodName = "UpdateCodeSecurityConfiguration"
   274  	testBadOptions(t, methodName, func() (err error) {
   275  		_, _, err = client.Organizations.UpdateCodeSecurityConfiguration(ctx, "\n", -1, input)
   276  		return
   277  	})
   278  
   279  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   280  		got, resp, err := client.Organizations.UpdateCodeSecurityConfiguration(ctx, "o", 1, input)
   281  		if got != nil {
   282  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   283  		}
   284  		return resp, err
   285  	})
   286  }
   287  
   288  func TestOrganizationsService_DeleteCodeSecurityConfiguration(t *testing.T) {
   289  	t.Parallel()
   290  	ctx := context.Background()
   291  	client, mux, _ := setup(t)
   292  
   293  	mux.HandleFunc("/orgs/o/code-security/configurations/1", func(w http.ResponseWriter, r *http.Request) {
   294  		testMethod(t, r, "DELETE")
   295  		w.WriteHeader(http.StatusNoContent)
   296  	})
   297  
   298  	resp, err := client.Organizations.DeleteCodeSecurityConfiguration(ctx, "o", 1)
   299  	if err != nil {
   300  		t.Errorf("Organizations.DeleteCodeSecurityConfiguration returned error: %v", err)
   301  	}
   302  
   303  	want := http.StatusNoContent
   304  	if resp.StatusCode != want {
   305  		t.Errorf("Organizations.DeleteCodeSecurityConfiguration returned status %d, want %d", resp.StatusCode, want)
   306  	}
   307  
   308  	const methodName = "DeleteCodeSecurityConfiguration"
   309  	testBadOptions(t, methodName, func() (err error) {
   310  		_, err = client.Organizations.DeleteCodeSecurityConfiguration(ctx, "\n", -1)
   311  		return
   312  	})
   313  
   314  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   315  		resp, err := client.Organizations.DeleteCodeSecurityConfiguration(ctx, "o", 1)
   316  		return resp, err
   317  	})
   318  }
   319  
   320  func TestOrganizationsService_AttachCodeSecurityConfigurationsToRepositories(t *testing.T) {
   321  	t.Parallel()
   322  	ctx := context.Background()
   323  	client, mux, _ := setup(t)
   324  
   325  	mux.HandleFunc("/orgs/o/code-security/configurations/1/attach", func(w http.ResponseWriter, r *http.Request) {
   326  		testMethod(t, r, "POST")
   327  		type request struct {
   328  			Scope                 string  `json:"scope"`
   329  			SelectedRepositoryIDs []int64 `json:"selected_repository_ids,omitempty"`
   330  		}
   331  		v := new(request)
   332  		err := json.NewDecoder(r.Body).Decode(v)
   333  		if err != nil {
   334  			t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories request body decode failed: %v", err)
   335  		}
   336  		if v.Scope != "selected" {
   337  			t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories request body scope = %s, want selected", v.Scope)
   338  		}
   339  		if !reflect.DeepEqual(v.SelectedRepositoryIDs, []int64{5, 20}) {
   340  			t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories request body selected_repository_ids = %+v, want %+v", v.SelectedRepositoryIDs, []int64{5, 20})
   341  		}
   342  		w.WriteHeader(http.StatusAccepted)
   343  	})
   344  
   345  	resp, err := client.Organizations.AttachCodeSecurityConfigurationsToRepositories(ctx, "o", int64(1), "selected", []int64{5, 20})
   346  	if err != nil {
   347  		t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories returned error: %v", err)
   348  	}
   349  
   350  	want := http.StatusAccepted
   351  	if resp.StatusCode != want {
   352  		t.Errorf("Organizations.AttachCodeSecurityConfigurationsToRepositories returned status %d, want %d", resp.StatusCode, want)
   353  	}
   354  
   355  	const methodName = "AttachCodeSecurityConfigurationsToRepositories"
   356  	testBadOptions(t, methodName, func() (err error) {
   357  		_, err = client.Organizations.AttachCodeSecurityConfigurationsToRepositories(ctx, "\n", -1, "", nil)
   358  		return
   359  	})
   360  
   361  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   362  		resp, err := client.Organizations.AttachCodeSecurityConfigurationsToRepositories(ctx, "o", 1, "selected", []int64{5, 20})
   363  		return resp, err
   364  	})
   365  }
   366  
   367  func TestOrganizationsService_SetDefaultCodeSecurityConfiguration(t *testing.T) {
   368  	t.Parallel()
   369  	ctx := context.Background()
   370  	client, mux, _ := setup(t)
   371  
   372  	mux.HandleFunc("/orgs/o/code-security/configurations/1/defaults", func(w http.ResponseWriter, r *http.Request) {
   373  		testMethod(t, r, "PUT")
   374  		fmt.Fprintf(w, `
   375  		{
   376  			"default_for_new_repos": "all",
   377  			"configuration":
   378  				{
   379  					"id": 1,
   380  					"name": "config1",
   381  					"code_scanning_default_setup": "enabled"
   382  				}
   383  		}`)
   384  	})
   385  	got, resp, err := client.Organizations.SetDefaultCodeSecurityConfiguration(ctx, "o", 1, "all")
   386  	if err != nil {
   387  		t.Errorf("Organizations.SetDefaultCodeSecurityConfiguration returned error: %v", err)
   388  	}
   389  	wantStatus := http.StatusOK
   390  	if resp.StatusCode != wantStatus {
   391  		t.Errorf("Organizations.SetDefaultCodeSecurityConfiguration returned status %d, want %d", resp.StatusCode, wantStatus)
   392  	}
   393  	want := &CodeSecurityConfigurationWithDefaultForNewRepos{
   394  		DefaultForNewRepos: Ptr("all"),
   395  		Configuration: &CodeSecurityConfiguration{
   396  			ID: Ptr(int64(1)), Name: Ptr("config1"), CodeScanningDefaultSetup: Ptr("enabled"),
   397  		},
   398  	}
   399  	if !reflect.DeepEqual(got, want) {
   400  		t.Errorf("Organizations.SetDefaultCodeSecurityConfiguration returned %+v, want %+v", got, want)
   401  	}
   402  
   403  	const methodName = "SetDefaultCodeSecurityConfiguration"
   404  	testBadOptions(t, methodName, func() (err error) {
   405  		_, _, err = client.Organizations.SetDefaultCodeSecurityConfiguration(ctx, "\n", -1, "")
   406  		return
   407  	})
   408  
   409  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   410  		got, resp, err := client.Organizations.SetDefaultCodeSecurityConfiguration(ctx, "o", 1, "all")
   411  		if got != nil {
   412  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   413  		}
   414  		return resp, err
   415  	})
   416  }
   417  
   418  func TestOrganizationsService_GetRepositoriesForCodeSecurityConfiguration(t *testing.T) {
   419  	t.Parallel()
   420  	ctx := context.Background()
   421  	client, mux, _ := setup(t)
   422  
   423  	mux.HandleFunc("/orgs/o/code-security/configurations/1/repositories", func(w http.ResponseWriter, r *http.Request) {
   424  		testMethod(t, r, "GET")
   425  		fmt.Fprint(w, `[
   426  		{
   427  			"id":8,
   428  			"name":"repo8"
   429  		},
   430  		{
   431  			"id":42,
   432  			"name":"repo42"
   433  		}]`)
   434  	})
   435  
   436  	repositories, _, err := client.Organizations.GetRepositoriesForCodeSecurityConfiguration(ctx, "o", 1)
   437  	if err != nil {
   438  		t.Errorf("Organizations.GetRepositoriesForCodeSecurityConfiguration returned error: %v", err)
   439  	}
   440  
   441  	want := []*Repository{
   442  		{ID: Ptr(int64(8)), Name: Ptr("repo8")},
   443  		{ID: Ptr(int64(42)), Name: Ptr("repo42")},
   444  	}
   445  	if !reflect.DeepEqual(repositories, want) {
   446  		t.Errorf("Organizations.GetRepositoriesForCodeSecurityConfiguration returned %+v, want %+v", repositories, want)
   447  	}
   448  
   449  	const methodName = "GetRepositoriesForCodeSecurityConfiguration"
   450  	testBadOptions(t, methodName, func() (err error) {
   451  		_, _, err = client.Organizations.GetRepositoriesForCodeSecurityConfiguration(ctx, "\n", -1)
   452  		return
   453  	})
   454  
   455  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   456  		got, resp, err := client.Organizations.GetRepositoriesForCodeSecurityConfiguration(ctx, "o", 1)
   457  		if got != nil {
   458  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   459  		}
   460  		return resp, err
   461  	})
   462  }
   463  
   464  func TestOrganizationsService_GetCodeSecurityConfigurationForRepository(t *testing.T) {
   465  	t.Parallel()
   466  	ctx := context.Background()
   467  	client, mux, _ := setup(t)
   468  
   469  	mux.HandleFunc("/repos/o/repo8/code-security-configuration", func(w http.ResponseWriter, r *http.Request) {
   470  		testMethod(t, r, "GET")
   471  		fmt.Fprint(w, `{
   472  		    "state": "attached",
   473  			"configuration": {
   474  				"id":42,
   475  				"name":"config42",
   476  				"code_scanning_default_setup": "enabled"
   477  			}
   478  		}`)
   479  	})
   480  
   481  	rc, _, err := client.Organizations.GetCodeSecurityConfigurationForRepository(ctx, "o", "repo8")
   482  	if err != nil {
   483  		t.Errorf("Organizations.GetCodeSecurityConfigurationForRepository returned error: %v", err)
   484  	}
   485  	c := &CodeSecurityConfiguration{ID: Ptr(int64(42)), Name: Ptr("config42"), CodeScanningDefaultSetup: Ptr("enabled")}
   486  	want := &RepositoryCodeSecurityConfiguration{
   487  		State:         Ptr("attached"),
   488  		Configuration: c,
   489  	}
   490  	if !reflect.DeepEqual(rc, want) {
   491  		t.Errorf("Organizations.GetCodeSecurityConfigurationForRepository returned %+v, want %+v", rc, want)
   492  	}
   493  
   494  	const methodName = "GetCodeSecurityConfigurationForRepository"
   495  	testBadOptions(t, methodName, func() (err error) {
   496  		_, _, err = client.Organizations.GetCodeSecurityConfigurationForRepository(ctx, "\n", "\n")
   497  		return
   498  	})
   499  
   500  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   501  		got, resp, err := client.Organizations.GetCodeSecurityConfigurationForRepository(ctx, "o", "repo8")
   502  		if got != nil {
   503  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   504  		}
   505  		return resp, err
   506  	})
   507  }