github.com/jfrog/jfrog-client-go@v1.40.2/tests/artifactorypermissiontarget_test.go (about)

     1  package tests
     2  
     3  import (
     4  	"crypto/rand"
     5  	"fmt"
     6  	"github.com/jfrog/jfrog-client-go/utils"
     7  	"testing"
     8  
     9  	"github.com/jfrog/jfrog-client-go/artifactory/services"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  )
    13  
    14  const (
    15  	PermissionTargetNamePrefix = "client-go-tests-target"
    16  )
    17  
    18  func TestPermissionTarget(t *testing.T) {
    19  	initArtifactoryTest(t)
    20  	params := services.NewPermissionTargetParams()
    21  	params.Name = fmt.Sprintf("%s-%s", PermissionTargetNamePrefix, getRunId())
    22  	params.Repo = &services.PermissionTargetSection{}
    23  	params.Repo.Repositories = []string{"ANY"}
    24  	params.Repo.ExcludePatterns = []string{"dir/*"}
    25  	params.Repo.Actions = &services.Actions{}
    26  	params.Repo.Actions.Users = map[string][]string{
    27  		"anonymous": {"read"},
    28  	}
    29  	params.Build = &services.PermissionTargetSection{}
    30  	params.Build.Repositories = []string{"artifactory-build-info"}
    31  	params.Build.Actions = &services.Actions{}
    32  	params.Build.Actions.Users = map[string][]string{
    33  		"anonymous": {"annotate"},
    34  	}
    35  
    36  	err := testsPermissionTargetService.Create(params)
    37  	assert.NoError(t, err)
    38  	// Fill in default values before validation
    39  	params.Repo.IncludePatterns = []string{"**"}
    40  	params.Build.Repositories = []string{"artifactory-build-info"}
    41  	params.Build.IncludePatterns = []string{"**"}
    42  	params.Build.ExcludePatterns = []string{}
    43  	validatePermissionTarget(t, params)
    44  
    45  	params.Repo.Actions.Users = nil
    46  	params.Repo.Repositories = []string{"ANY REMOTE"}
    47  	err = testsPermissionTargetService.Update(params)
    48  	validatePermissionTarget(t, params)
    49  	assert.NoError(t, err)
    50  	err = testsPermissionTargetService.Delete(params.Name)
    51  	assert.NoError(t, err)
    52  	targetParams, err := getPermissionTarget(params.Name)
    53  	assert.NoError(t, err)
    54  	assert.Nil(t, targetParams)
    55  }
    56  
    57  func validatePermissionTarget(t *testing.T, params services.PermissionTargetParams) {
    58  	targetConfig, err := getPermissionTarget(params.Name)
    59  	assert.NoError(t, err)
    60  	assert.NotNil(t, targetConfig)
    61  	if targetConfig == nil {
    62  		return
    63  	}
    64  	assert.Equal(t, params.Name, targetConfig.Name)
    65  	assert.Equal(t, params.Repo, targetConfig.Repo)
    66  	assert.Equal(t, params.Build, targetConfig.Build)
    67  	assert.Equal(t, params.ReleaseBundle, targetConfig.ReleaseBundle)
    68  }
    69  
    70  func getPermissionTarget(targetName string) (targetParams *services.PermissionTargetParams, err error) {
    71  	return testsPermissionTargetService.Get(targetName)
    72  }
    73  
    74  // Assert empty inner structs remain nil unless explicitly set.
    75  func TestPermissionTargetEmptyFields(t *testing.T) {
    76  	initArtifactoryTest(t)
    77  	params := services.NewPermissionTargetParams()
    78  	params.Name = fmt.Sprintf("%s-%s", PermissionTargetNamePrefix, getRunId())
    79  
    80  	assert.Nil(t, params.Repo)
    81  	params.Repo = &services.PermissionTargetSection{}
    82  	params.Repo.Repositories = []string{"ANY"}
    83  	params.Repo.IncludePatterns = []string{"**"}
    84  	params.Repo.ExcludePatterns = []string{"dir/*"}
    85  	params.Repo.Actions = &services.Actions{}
    86  	params.Repo.Actions.Users = map[string][]string{
    87  		"anonymous": {"read"},
    88  	}
    89  
    90  	assert.Nil(t, params.Build)
    91  	assert.Nil(t, params.ReleaseBundle)
    92  	assert.NoError(t, testsPermissionTargetService.Create(params))
    93  	validatePermissionTarget(t, params)
    94  	err := testsPermissionTargetService.Delete(params.Name)
    95  	assert.NoError(t, err)
    96  }
    97  
    98  // This test directly copies the example in the documentation:
    99  // - Creating and Updating Permission Targets
   100  func TestDocumentationExampleCreateUpdateAndDeletePermissionTarget(t *testing.T) {
   101  	initArtifactoryTest(t)
   102  
   103  	// Preamble to get dependent entities setup
   104  	user1 := createRandomUser(t)
   105  	defer deleteUserAndAssert(t, user1)
   106  
   107  	user2 := createRandomUser(t)
   108  	defer deleteUserAndAssert(t, user2)
   109  
   110  	localRepo1 := createRandomRepo(t)
   111  	defer deleteRepo(t, localRepo1)
   112  
   113  	localRepo2 := createRandomRepo(t)
   114  	defer deleteRepo(t, localRepo2)
   115  
   116  	group1 := createRandomGroup(t)
   117  	defer deleteGroupAndAssert(t, group1)
   118  
   119  	group2 := createRandomGroup(t)
   120  	defer deleteGroupAndAssert(t, group2)
   121  
   122  	// Example code from Documentation
   123  	params := services.NewPermissionTargetParams()
   124  	params.Name = "java-developers"
   125  	params.Repo = &services.PermissionTargetSection{}
   126  	params.Repo.Repositories = []string{"ANY REMOTE", localRepo1, localRepo2}
   127  	params.Repo.ExcludePatterns = []string{"dir/*"}
   128  	params.Repo.Actions = &services.Actions{}
   129  	params.Repo.Actions.Users = map[string][]string{
   130  		user1: {"read", "write"},
   131  		user2: {"write", "annotate", "read"},
   132  	}
   133  	params.Repo.Actions.Groups = map[string][]string{
   134  		group1: {"manage", "read", "annotate"},
   135  	}
   136  	// This is the default value that cannot be changed
   137  	params.Build = &services.PermissionTargetSection{}
   138  	params.Build.Repositories = []string{"artifactory-build-info"}
   139  	params.Build.Actions = &services.Actions{}
   140  	params.Build.Actions.Groups = map[string][]string{
   141  		group1: {"manage", "read", "write", "annotate", "delete"},
   142  		group2: {"read"},
   143  	}
   144  
   145  	// Creating the Permission Target
   146  	err := testsPermissionTargetService.Create(params)
   147  	assert.NoError(t, err)
   148  
   149  	// Update the permission target
   150  	err = testsPermissionTargetService.Update(params)
   151  	assert.NoError(t, err)
   152  
   153  	// Fetch a permission target
   154  	_, err = testsPermissionTargetService.Get("java-developers")
   155  	assert.NoError(t, err)
   156  
   157  	// Delete the permission target
   158  	err = testsPermissionTargetService.Delete("java-developers")
   159  	assert.NoError(t, err)
   160  }
   161  
   162  func createRandomUser(t *testing.T) string {
   163  	name := fmt.Sprintf("test-%s-%s", timestampStr, randomString(t, 16))
   164  	userDetails := services.User{
   165  		Name:                     name,
   166  		Email:                    name + "@jfrog.com",
   167  		Password:                 "Password1*",
   168  		Admin:                    utils.Pointer(false),
   169  		Realm:                    "internal",
   170  		ShouldInvite:             utils.Pointer(false),
   171  		ProfileUpdatable:         utils.Pointer(true),
   172  		DisableUIAccess:          utils.Pointer(false),
   173  		InternalPasswordDisabled: utils.Pointer(false),
   174  		WatchManager:             utils.Pointer(false),
   175  		ReportsManager:           utils.Pointer(false),
   176  		PolicyManager:            utils.Pointer(false),
   177  	}
   178  
   179  	err := testUserService.CreateUser(services.UserParams{
   180  		UserDetails:     userDetails,
   181  		ReplaceIfExists: true,
   182  	})
   183  
   184  	assert.NoError(t, err)
   185  
   186  	return name
   187  }
   188  
   189  func createRandomRepo(t *testing.T) string {
   190  	repoKey := fmt.Sprintf("test-%s-%s", timestampStr, randomString(t, 16))
   191  	glp := services.NewGenericLocalRepositoryParams()
   192  	glp.Key = repoKey
   193  	setLocalRepositoryBaseParams(&glp.LocalRepositoryBaseParams, false)
   194  
   195  	err := testsCreateLocalRepositoryService.Generic(glp)
   196  	assert.NoError(t, err)
   197  
   198  	return repoKey
   199  }
   200  
   201  func createRandomGroup(t *testing.T) string {
   202  	name := fmt.Sprintf("test-%s-%s", timestampStr, randomString(t, 16))
   203  
   204  	groupDetails := services.Group{
   205  		Name:            name,
   206  		Description:     "hello",
   207  		AutoJoin:        utils.Pointer(false),
   208  		AdminPrivileges: utils.Pointer(false),
   209  		Realm:           "internal",
   210  		RealmAttributes: "",
   211  	}
   212  
   213  	groupParams := services.GroupParams{
   214  		GroupDetails: groupDetails,
   215  		IncludeUsers: false,
   216  	}
   217  
   218  	err := testGroupService.CreateGroup(groupParams)
   219  	assert.NoError(t, err)
   220  
   221  	return name
   222  }
   223  
   224  func randomString(t *testing.T, length int) string {
   225  	b := make([]byte, length)
   226  	_, err := rand.Read(b)
   227  	assert.NoError(t, err)
   228  	return fmt.Sprintf("%x", b)[:length]
   229  }