Verified Commit ccb318dc authored by dragonrider.'s avatar dragonrider. Committed by GitLab
Browse files

feat(users): add SCIMIdentities field to User type

Changelog: Improvements
parent b9243ae7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
  "current_sign_in_at": "2012-06-02T06:36:55Z",
  "note": "DMCA Request: 2018-11-05 | DMCA Violation | Abuse | https://gitlab.zendesk.com/agent/tickets/123",
  "identities": [{ "provider": "github", "extern_uid": "2435223452345" }],
  "scim_identities": [{ "extern_uid": "be20d8dcc028677c931e04f387", "group_id": 1, "active": true }],
  "can_create_group": true,
  "can_create_project": true,
  "two_factor_enabled": true,
+17 −0
Original line number Diff line number Diff line
{
  "id": 5,
  "username": "jane_doe",
  "email": "jane@example.com",
  "name": "Jane Doe",
  "state": "active",
  "avatar_url": "http://localhost:3000/uploads/user/avatar/5/avatar.jpeg",
  "web_url": "http://localhost:3000/jane_doe",
  "created_at": "2023-01-15T10:00:00Z",
  "identities": [
    { "provider": "saml", "extern_uid": "saml-uid-abc123" }
  ],
  "scim_identities": [
    { "extern_uid": "scim-uid-abc123", "group_id": 10, "active": true },
    { "extern_uid": "scim-uid-old456", "group_id": 20, "active": false }
  ]
}
+8 −0
Original line number Diff line number Diff line
@@ -400,6 +400,7 @@ type User struct {
	TwoFactorEnabled               bool               `json:"two_factor_enabled"`
	Note                           string             `json:"note"`
	Identities                     []*UserIdentity    `json:"identities"`
	SCIMIdentities                 []*SCIMIdentity    `json:"scim_identities"`
	External                       bool               `json:"external"`
	PrivateProfile                 bool               `json:"private_profile"`
	SharedRunnersMinutesLimit      int64              `json:"shared_runners_minutes_limit"`
@@ -417,6 +418,13 @@ type UserIdentity struct {
	ExternUID string `json:"extern_uid"`
}

// SCIMIdentity represents a SCIM identity for a user.
type SCIMIdentity struct {
	ExternUID string `json:"extern_uid"`
	GroupID   int64  `json:"group_id"`
	Active    bool   `json:"active"`
}

// UserAvatar represents a GitLab user avatar.
//
// GitLab API docs: https://docs.gitlab.com/api/users/
+44 −0
Original line number Diff line number Diff line
@@ -63,6 +63,49 @@ func TestGetUser(t *testing.T) {
	assert.Equal(t, want, user)
}

func TestGetUserSCIMIdentities(t *testing.T) {
	t.Parallel()
	mux, client := setup(t)

	// GIVEN a user with multiple SCIM identities (one active, one inactive)
	mux.HandleFunc("/api/v4/users/5", func(w http.ResponseWriter, r *http.Request) {
		testMethod(t, r, http.MethodGet)
		mustWriteHTTPResponse(t, w, "testdata/get_user_with_scim_identities.json")
	})

	// WHEN retrieving the user
	user, _, err := client.Users.GetUser(5, &GetUserOptions{})

	// THEN the SCIM identities are correctly unmarshaled
	assert.NoError(t, err)
	assert.NotNil(t, user)
	assert.Len(t, user.SCIMIdentities, 2)
	assert.Equal(t, &SCIMIdentity{ExternUID: "scim-uid-abc123", GroupID: 10, Active: true}, user.SCIMIdentities[0])
	assert.Equal(t, &SCIMIdentity{ExternUID: "scim-uid-old456", GroupID: 20, Active: false}, user.SCIMIdentities[1])
	// AND the regular identities are still correctly unmarshaled
	assert.Len(t, user.Identities, 1)
	assert.Equal(t, &UserIdentity{Provider: "saml", ExternUID: "saml-uid-abc123"}, user.Identities[0])
}

func TestGetUserNoSCIMIdentities(t *testing.T) {
	t.Parallel()
	mux, client := setup(t)

	// GIVEN a user with no scim_identities field in the response
	mux.HandleFunc("/api/v4/users/1", func(w http.ResponseWriter, r *http.Request) {
		testMethod(t, r, http.MethodGet)
		mustWriteHTTPResponse(t, w, "testdata/get_user.json")
	})

	// WHEN retrieving the user
	user, _, err := client.Users.GetUser(1, &GetUserOptions{})

	// THEN SCIMIdentities is nil (not an empty slice)
	assert.NoError(t, err)
	assert.NotNil(t, user)
	assert.Nil(t, user.SCIMIdentities)
}

func TestGetUserAdmin(t *testing.T) {
	t.Parallel()
	mux, client := setup(t)
@@ -115,6 +158,7 @@ func TestGetUserAdmin(t *testing.T) {
		TwoFactorEnabled: true,
		Note:             "DMCA Request: 2018-11-05 | DMCA Violation | Abuse | https://gitlab.zendesk.com/agent/tickets/123",
		Identities:       []*UserIdentity{{Provider: "github", ExternUID: "2435223452345"}},
		SCIMIdentities:   []*SCIMIdentity{{ExternUID: "be20d8dcc028677c931e04f387", GroupID: 1, Active: true}},
		NamespaceID:      42,
	}
	assert.Equal(t, want, user)