Commit 81aace77 authored by Nicholas Colbert's avatar Nicholas Colbert Committed by Sander van Harmelen

added custom attributes (#451)

* added custom attributes

added tests

fixed typo

* Refactored to fit idioms of the package better

refactored methods to be  to have fully named functions

rewrote tests

updated typos and syntax

* fixed typo caught by linter

* refactored per maintainers request

removed blank line
parent 6504041b
package gitlab
import (
"fmt"
)
// CustomAttributesService handles communication with the group, project and
// user custom attributes related methods of the GitLab API.
//
// GitLab API docs: https://docs.gitlab.com/ce/api/custom_attributes.html
type CustomAttributesService struct {
client *Client
}
// CustomAttribute struct is used to unmarshal response to api calls.
//
// GitLab API docs: https://docs.gitlab.com/ce/api/custom_attributes.html
type CustomAttribute struct {
Key string `json:"key"`
Value string `json:"value"`
}
// ListCustomUserAttributes lists the custom attributes of the specified user.
//
// GitLab API docs:
// https://docs.gitlab.com/ce/api/custom_attributes.html#list-custom-attributes
func (s *CustomAttributesService) ListCustomUserAttributes(user int, options ...OptionFunc) ([]*CustomAttribute, *Response, error) {
return s.listCustomAttributes("users", user, options...)
}
// ListCustomGroupAttributes lists the custom attributes of the specified group.
//
// GitLab API docs:
// https://docs.gitlab.com/ce/api/custom_attributes.html#list-custom-attributes
func (s *CustomAttributesService) ListCustomGroupAttributes(group int, options ...OptionFunc) ([]*CustomAttribute, *Response, error) {
return s.listCustomAttributes("groups", group, options...)
}
// ListCustomProjectAttributes lists the custom attributes of the specified project.
//
// GitLab API docs:
// https://docs.gitlab.com/ce/api/custom_attributes.html#list-custom-attributes
func (s *CustomAttributesService) ListCustomProjectAttributes(project int, options ...OptionFunc) ([]*CustomAttribute, *Response, error) {
return s.listCustomAttributes("projects", project, options...)
}
func (s *CustomAttributesService) listCustomAttributes(resource string, id int, options ...OptionFunc) ([]*CustomAttribute, *Response, error) {
u := fmt.Sprintf("%s/%d/custom_attributes", resource, id)
req, err := s.client.NewRequest("GET", u, nil, options)
if err != nil {
return nil, nil, err
}
var cas []*CustomAttribute
resp, err := s.client.Do(req, &cas)
if err != nil {
return nil, resp, err
}
return cas, resp, err
}
// GetCustomUserAttribute returns the user attribute with a speciifc key.
//
// GitLab API docs:
// https://docs.gitlab.com/ce/api/custom_attributes.html#single-custom-attribute
func (s *CustomAttributesService) GetCustomUserAttribute(user int, key string, options ...OptionFunc) (*CustomAttribute, *Response, error) {
return s.getCustomAttribute("users", user, key, options...)
}
// GetCustomGroupAttribute returns the group attribute with a speciifc key.
//
// GitLab API docs:
// https://docs.gitlab.com/ce/api/custom_attributes.html#single-custom-attribute
func (s *CustomAttributesService) GetCustomGroupAttribute(group int, key string, options ...OptionFunc) (*CustomAttribute, *Response, error) {
return s.getCustomAttribute("groups", group, key, options...)
}
// GetCustomProjectAttribute returns the project attribute with a speciifc key.
//
// GitLab API docs:
// https://docs.gitlab.com/ce/api/custom_attributes.html#single-custom-attribute
func (s *CustomAttributesService) GetCustomProjectAttribute(project int, key string, options ...OptionFunc) (*CustomAttribute, *Response, error) {
return s.getCustomAttribute("projects", project, key, options...)
}
func (s *CustomAttributesService) getCustomAttribute(resource string, id int, key string, options ...OptionFunc) (*CustomAttribute, *Response, error) {
u := fmt.Sprintf("%s/%d/custom_attributes/%s", resource, id, key)
req, err := s.client.NewRequest("GET", u, nil, options)
if err != nil {
return nil, nil, err
}
var ca *CustomAttribute
resp, err := s.client.Do(req, &ca)
if err != nil {
return nil, resp, err
}
return ca, resp, err
}
// SetCustomUserAttribute sets the custom attributes of the specified user.
//
// GitLab API docs:
// https://docs.gitlab.com/ce/api/custom_attributes.html#set-custom-attribute
func (s *CustomAttributesService) SetCustomUserAttribute(user int, c CustomAttribute, options ...OptionFunc) (*CustomAttribute, *Response, error) {
return s.setCustomAttribute("users", user, c, options...)
}
// SetCustomGroupAttribute sets the custom attributes of the specified group.
//
// GitLab API docs:
// https://docs.gitlab.com/ce/api/custom_attributes.html#set-custom-attribute
func (s *CustomAttributesService) SetCustomGroupAttribute(group int, c CustomAttribute, options ...OptionFunc) (*CustomAttribute, *Response, error) {
return s.setCustomAttribute("groups", group, c, options...)
}
// SetCustomProjectAttribute sets the custom attributes of the specified project.
//
// GitLab API docs:
// https://docs.gitlab.com/ce/api/custom_attributes.html#set-custom-attribute
func (s *CustomAttributesService) SetCustomProjectAttribute(project int, c CustomAttribute, options ...OptionFunc) (*CustomAttribute, *Response, error) {
return s.setCustomAttribute("projects", project, c, options...)
}
func (s *CustomAttributesService) setCustomAttribute(resource string, id int, c CustomAttribute, options ...OptionFunc) (*CustomAttribute, *Response, error) {
u := fmt.Sprintf("%s/%d/custom_attributes/%s", resource, id, c.Key)
req, err := s.client.NewRequest("PUT", u, c, options)
if err != nil {
return nil, nil, err
}
ca := new(CustomAttribute)
resp, err := s.client.Do(req, ca)
if err != nil {
return nil, resp, err
}
return ca, resp, err
}
// DeleteCustomUserAttribute removes the custom attribute of the specified user.
//
// GitLab API docs:
// https://docs.gitlab.com/ce/api/custom_attributes.html#delete-custom-attribute
func (s *CustomAttributesService) DeleteCustomUserAttribute(user int, key string, options ...OptionFunc) (*Response, error) {
return s.deleteCustomAttribute("users", user, key, options...)
}
// DeleteCustomGroupAttribute removes the custom attribute of the specified group.
//
// GitLab API docs:
// https://docs.gitlab.com/ce/api/custom_attributes.html#delete-custom-attribute
func (s *CustomAttributesService) DeleteCustomGroupAttribute(group int, key string, options ...OptionFunc) (*Response, error) {
return s.deleteCustomAttribute("groups", group, key, options...)
}
// DeleteCustomProjectAttribute removes the custom attribute of the specified project.
//
// GitLab API docs:
// https://docs.gitlab.com/ce/api/custom_attributes.html#delete-custom-attribute
func (s *CustomAttributesService) DeleteCustomProjectAttribute(project int, key string, options ...OptionFunc) (*Response, error) {
return s.deleteCustomAttribute("projects", project, key, options...)
}
func (s *CustomAttributesService) deleteCustomAttribute(resource string, id int, key string, options ...OptionFunc) (*Response, error) {
u := fmt.Sprintf("%s/%d/custom_attributes/%s", resource, id, key)
req, err := s.client.NewRequest("DELETE", u, nil, options)
if err != nil {
return nil, err
}
return s.client.Do(req, nil)
}
package gitlab
import (
"fmt"
"net/http"
"reflect"
"testing"
)
func TestListCustomUserAttributes(t *testing.T) {
mux, server, client := setup()
defer teardown(server)
mux.HandleFunc("/api/v4/users/2/custom_attributes", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
fmt.Fprint(w, `[{"key":"testkey1", "value":"testvalue1"}, {"key":"testkey2", "value":"testvalue2"}]`)
})
customAttributes, _, err := client.CustomAttribute.ListCustomUserAttributes(2)
if err != nil {
t.Errorf("CustomAttribute.ListCustomUserAttributes returned error: %v", err)
}
want := []*CustomAttribute{{Key: "testkey1", Value: "testvalue1"}, {Key: "testkey2", Value: "testvalue2"}}
if !reflect.DeepEqual(want, customAttributes) {
t.Errorf("CustomAttribute.ListCustomUserAttributes returned %+v, want %+v", customAttributes, want)
}
}
func TestListCustomGroupAttributes(t *testing.T) {
mux, server, client := setup()
defer teardown(server)
mux.HandleFunc("/api/v4/groups/2/custom_attributes", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
fmt.Fprint(w, `[{"key":"testkey1", "value":"testvalue1"}, {"key":"testkey2", "value":"testvalue2"}]`)
})
customAttributes, _, err := client.CustomAttribute.ListCustomGroupAttributes(2)
if err != nil {
t.Errorf("CustomAttribute.ListCustomGroupAttributes returned error: %v", err)
}
want := []*CustomAttribute{{Key: "testkey1", Value: "testvalue1"}, {Key: "testkey2", Value: "testvalue2"}}
if !reflect.DeepEqual(want, customAttributes) {
t.Errorf("CustomAttribute.ListCustomGroupAttributes returned %+v, want %+v", customAttributes, want)
}
}
func TestListCustomProjectAttributes(t *testing.T) {
mux, server, client := setup()
defer teardown(server)
mux.HandleFunc("/api/v4/projects/2/custom_attributes", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
fmt.Fprint(w, `[{"key":"testkey1", "value":"testvalue1"}, {"key":"testkey2", "value":"testvalue2"}]`)
})
customAttributes, _, err := client.CustomAttribute.ListCustomProjectAttributes(2)
if err != nil {
t.Errorf("CustomAttribute.ListCustomProjectAttributes returned error: %v", err)
}
want := []*CustomAttribute{{Key: "testkey1", Value: "testvalue1"}, {Key: "testkey2", Value: "testvalue2"}}
if !reflect.DeepEqual(want, customAttributes) {
t.Errorf("CustomAttribute.ListCustomProjectAttributes returned %+v, want %+v", customAttributes, want)
}
}
func TestGetCustomUserAttribute(t *testing.T) {
mux, server, client := setup()
defer teardown(server)
mux.HandleFunc("/api/v4/users/2/custom_attributes/testkey1", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
fmt.Fprint(w, `{"key":"testkey1", "value":"testvalue1"}`)
})
customAttribute, _, err := client.CustomAttribute.GetCustomUserAttribute(2, "testkey1")
if err != nil {
t.Errorf("CustomAttribute.GetCustomUserAttribute returned error: %v", err)
}
want := &CustomAttribute{Key: "testkey1", Value: "testvalue1"}
if !reflect.DeepEqual(want, customAttribute) {
t.Errorf("CustomAttribute.GetCustomUserAttribute returned %+v, want %+v", customAttribute, want)
}
}
func TestGetCustomGropupAttribute(t *testing.T) {
mux, server, client := setup()
defer teardown(server)
mux.HandleFunc("/api/v4/groups/2/custom_attributes/testkey1", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
fmt.Fprint(w, `{"key":"testkey1", "value":"testvalue1"}`)
})
customAttribute, _, err := client.CustomAttribute.GetCustomGroupAttribute(2, "testkey1")
if err != nil {
t.Errorf("CustomAttribute.GetCustomGroupAttribute returned error: %v", err)
}
want := &CustomAttribute{Key: "testkey1", Value: "testvalue1"}
if !reflect.DeepEqual(want, customAttribute) {
t.Errorf("CustomAttribute.GetCustomGroupAttribute returned %+v, want %+v", customAttribute, want)
}
}
func TestGetCustomProjectAttribute(t *testing.T) {
mux, server, client := setup()
defer teardown(server)
mux.HandleFunc("/api/v4/projects/2/custom_attributes/testkey1", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
fmt.Fprint(w, `{"key":"testkey1", "value":"testvalue1"}`)
})
customAttribute, _, err := client.CustomAttribute.GetCustomProjectAttribute(2, "testkey1")
if err != nil {
t.Errorf("CustomAttribute.GetCustomProjectAttribute returned error: %v", err)
}
want := &CustomAttribute{Key: "testkey1", Value: "testvalue1"}
if !reflect.DeepEqual(want, customAttribute) {
t.Errorf("CustomAttribute.GetCustomProjectAttribute returned %+v, want %+v", customAttribute, want)
}
}
func TestSetCustomUserAttribute(t *testing.T) {
mux, server, client := setup()
defer teardown(server)
mux.HandleFunc("/api/v4/users/2/custom_attributes/testkey1", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "PUT")
fmt.Fprint(w, `{"key":"testkey1", "value":"testvalue1"}`)
})
customAttribute, _, err := client.CustomAttribute.SetCustomUserAttribute(2, CustomAttribute{
Key: "testkey1",
Value: "testvalue1",
})
if err != nil {
t.Errorf("CustomAttribute.SetCustomUserAttributes returned error: %v", err)
}
want := &CustomAttribute{Key: "testkey1", Value: "testvalue1"}
if !reflect.DeepEqual(want, customAttribute) {
t.Errorf("CustomAttribute.SetCustomUserAttributes returned %+v, want %+v", customAttribute, want)
}
}
func TestSetCustomGroupAttribute(t *testing.T) {
mux, server, client := setup()
defer teardown(server)
mux.HandleFunc("/api/v4/groups/2/custom_attributes/testkey1", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "PUT")
fmt.Fprint(w, `{"key":"testkey1", "value":"testvalue1"}`)
})
customAttribute, _, err := client.CustomAttribute.SetCustomGroupAttribute(2, CustomAttribute{
Key: "testkey1",
Value: "testvalue1",
})
if err != nil {
t.Errorf("CustomAttribute.SetCustomGroupAttributes returned error: %v", err)
}
want := &CustomAttribute{Key: "testkey1", Value: "testvalue1"}
if !reflect.DeepEqual(want, customAttribute) {
t.Errorf("CustomAttribute.SetCustomGroupAttributes returned %+v, want %+v", customAttribute, want)
}
}
func TestDeleteCustomUserAttribute(t *testing.T) {
mux, server, client := setup()
defer teardown(server)
mux.HandleFunc("/api/v4/users/2/custom_attributes/testkey1", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "DELETE")
w.WriteHeader(http.StatusAccepted)
})
resp, err := client.CustomAttribute.DeleteCustomUserAttribute(2, "testkey1")
if err != nil {
t.Errorf("CustomAttribute.DeleteCustomUserAttribute returned error: %v", err)
}
want := http.StatusAccepted
got := resp.StatusCode
if got != want {
t.Errorf("CustomAttribute.DeleteCustomUserAttribute returned %d, want %d", got, want)
}
}
func TestDeleteCustomGroupAttribute(t *testing.T) {
mux, server, client := setup()
defer teardown(server)
mux.HandleFunc("/api/v4/groups/2/custom_attributes/testkey1", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "DELETE")
w.WriteHeader(http.StatusAccepted)
})
resp, err := client.CustomAttribute.DeleteCustomGroupAttribute(2, "testkey1")
if err != nil {
t.Errorf("CustomAttribute.DeleteCustomGroupAttribute returned error: %v", err)
}
want := http.StatusAccepted
got := resp.StatusCode
if got != want {
t.Errorf("CustomAttribute.DeleteCustomGroupAttribute returned %d, want %d", got, want)
}
}
func TestDeleteCustomProjectAttribute(t *testing.T) {
mux, server, client := setup()
defer teardown(server)
mux.HandleFunc("/api/v4/projects/2/custom_attributes/testkey1", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "DELETE")
w.WriteHeader(http.StatusAccepted)
})
resp, err := client.CustomAttribute.DeleteCustomProjectAttribute(2, "testkey1")
if err != nil {
t.Errorf("CustomAttribute.DeleteCustomProjectAttribute returned error: %v", err)
}
want := http.StatusAccepted
got := resp.StatusCode
if got != want {
t.Errorf("CustomAttribute.DeleteCustomProjectAttribute returned %d, want %d", got, want)
}
}
...@@ -278,6 +278,7 @@ type Client struct { ...@@ -278,6 +278,7 @@ type Client struct {
BuildVariables *BuildVariablesService BuildVariables *BuildVariablesService
BroadcastMessage *BroadcastMessagesService BroadcastMessage *BroadcastMessagesService
Commits *CommitsService Commits *CommitsService
CustomAttribute *CustomAttributesService
DeployKeys *DeployKeysService DeployKeys *DeployKeysService
Deployments *DeploymentsService Deployments *DeploymentsService
Environments *EnvironmentsService Environments *EnvironmentsService
...@@ -413,6 +414,7 @@ func newClient(httpClient *http.Client) *Client { ...@@ -413,6 +414,7 @@ func newClient(httpClient *http.Client) *Client {
c.BuildVariables = &BuildVariablesService{client: c} c.BuildVariables = &BuildVariablesService{client: c}
c.BroadcastMessage = &BroadcastMessagesService{client: c} c.BroadcastMessage = &BroadcastMessagesService{client: c}
c.Commits = &CommitsService{client: c} c.Commits = &CommitsService{client: c}
c.CustomAttribute = &CustomAttributesService{client: c}
c.DeployKeys = &DeployKeysService{client: c} c.DeployKeys = &DeployKeysService{client: c}
c.Deployments = &DeploymentsService{client: c} c.Deployments = &DeploymentsService{client: c}
c.Environments = &EnvironmentsService{client: c} c.Environments = &EnvironmentsService{client: c}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment