...

Source file src/edge-infra.dev/pkg/edge/edgeadmin/commands/operatorintervention/delete/role_mapping_test.go

Documentation: edge-infra.dev/pkg/edge/edgeadmin/commands/operatorintervention/delete

     1  //nolint:dupl
     2  package delete
     3  
     4  import (
     5  	"context"
     6  	"encoding/json"
     7  	"errors"
     8  	"strings"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"edge-infra.dev/pkg/edge/api/fake"
    15  	"edge-infra.dev/pkg/edge/api/graph/model"
    16  	"edge-infra.dev/pkg/edge/edgecli"
    17  	"edge-infra.dev/pkg/edge/edgecli/flagutil"
    18  	"edge-infra.dev/pkg/lib/cli/rags"
    19  )
    20  
    21  type DeleteOperatorInterventionRoleMappingResponse struct {
    22  	DeleteOperatorInterventionRoleMapping model.DeleteOperatorInterventionResponse `json:"deleteOperatorInterventionRoleMapping"`
    23  }
    24  
    25  // Mocks the DeleteOperatorInterventionRoleMappingResponse. Returns an error
    26  // response when the role `bad-role` is sent, otherwise returns a
    27  // non-error response
    28  func DeleteOperatorInterventionRoleMapping(body []byte) (interface{}, bool, error) {
    29  	if !strings.Contains(string(body), "deleteOperatorInterventionRoleMapping(mapping: $mapping)") {
    30  		return nil, false, nil
    31  	}
    32  
    33  	var ok = true
    34  
    35  	var m struct {
    36  		Query     string
    37  		Variables struct {
    38  			Mapping struct {
    39  				Role      string
    40  				Privilege struct {
    41  					Name string
    42  				}
    43  			}
    44  		}
    45  	}
    46  	err := json.Unmarshal(body, &m)
    47  	if err != nil {
    48  		return nil, ok, err
    49  	}
    50  
    51  	var errors []*model.OperatorInterventionErrorResponse
    52  	if m.Variables.Mapping.Role == "bad-role" {
    53  		errors = []*model.OperatorInterventionErrorResponse{{
    54  			Type:      model.OperatorInterventionErrorTypeUnknownRoleMapping,
    55  			Role:      &m.Variables.Mapping.Role,
    56  			Privilege: &m.Variables.Mapping.Privilege.Name,
    57  		}}
    58  	}
    59  	return DeleteOperatorInterventionRoleMappingResponse{
    60  		DeleteOperatorInterventionRoleMapping: model.DeleteOperatorInterventionResponse{
    61  			Errors: errors,
    62  		},
    63  	}, ok, nil
    64  }
    65  
    66  func TestDeleteRoleMapping(t *testing.T) {
    67  	t.Parallel()
    68  
    69  	edgeAPIMockSvr := fake.GetMockAPIServer(DeleteOperatorInterventionRoleMapping)
    70  	edgeAPIMockURL := edgeAPIMockSvr.URL + "/api/v2"
    71  	t.Cleanup(func() {
    72  		edgeAPIMockSvr.Close()
    73  	})
    74  
    75  	tests := map[string]struct {
    76  		flagsFunc func(*rags.RagSet) error
    77  		expError  require.ErrorAssertionFunc
    78  	}{
    79  		"No Flags": {
    80  			flagsFunc: func(*rags.RagSet) error { return nil },
    81  			expError:  require.Error,
    82  		},
    83  		"Only Role Flag": {
    84  			flagsFunc: func(rs *rags.RagSet) error {
    85  				return flagutil.SetFlag(rs, flagutil.OIRole, "abcd")
    86  			},
    87  			expError: require.Error,
    88  		},
    89  		"Only Privilege Flag": {
    90  			flagsFunc: func(rs *rags.RagSet) error {
    91  				return flagutil.SetFlag(rs, flagutil.OIPrivilege, "efgh")
    92  			},
    93  			expError: require.Error,
    94  		},
    95  		"All flags": {
    96  			flagsFunc: func(rs *rags.RagSet) error {
    97  				return errors.Join(
    98  					flagutil.SetFlag(rs, flagutil.OIRole, "abcd"),
    99  					flagutil.SetFlag(rs, flagutil.OIPrivilege, "efgh"),
   100  				)
   101  			},
   102  			expError: require.NoError,
   103  		},
   104  		"Unknown role mapping": {
   105  			flagsFunc: func(rs *rags.RagSet) error {
   106  				return errors.Join(
   107  					flagutil.SetFlag(rs, flagutil.OIRole, "bad-role"),
   108  					flagutil.SetFlag(rs, flagutil.OIPrivilege, "efgh"),
   109  				)
   110  			},
   111  			expError: require.Error,
   112  		},
   113  	}
   114  
   115  	for name, tc := range tests {
   116  		tc := tc
   117  		t.Run(name, func(t *testing.T) {
   118  			t.Parallel()
   119  
   120  			// Set a dummy token in a fake banner context so that we bypass the
   121  			// ValidateConnectionFlags check which would otherwise do a login
   122  			// mutation to the api server, something which is not supported by
   123  			// the fake server
   124  			future := time.Now().Add(time.Hour * 24)
   125  			testConfig := edgecli.Config{
   126  				CurrentBannerContext: "fakeBanner",
   127  				BannerContexts: map[string]*edgecli.BannerContext{
   128  					"fakeBanner": {
   129  						TokenTime: future.Format(time.RFC3339),
   130  						Token:     "fakeToken",
   131  						Endpoint:  edgeAPIMockURL,
   132  					},
   133  				},
   134  			}
   135  
   136  			cmd := NewDeleteRoleMapping(&testConfig)
   137  			cmd.Command() // Required to initialise cmd.Rags
   138  
   139  			require.NoError(t, tc.flagsFunc(cmd.Rags))
   140  
   141  			err := cmd.Command().Exec(context.Background(), []string{})
   142  			tc.expError(t, err)
   143  		})
   144  	}
   145  }
   146  

View as plain text