mirror of
https://github.com/interviewstreet/go-jira.git
synced 2025-02-03 13:11:49 +02:00
Feature: Add support for Jira ServiceDesk and its organizations
This commit is contained in:
parent
5601d2bfe2
commit
3017996765
4
jira.go
4
jira.go
@ -56,6 +56,8 @@ type Client struct {
|
|||||||
PermissionScheme *PermissionSchemeService
|
PermissionScheme *PermissionSchemeService
|
||||||
Status *StatusService
|
Status *StatusService
|
||||||
IssueLinkType *IssueLinkTypeService
|
IssueLinkType *IssueLinkTypeService
|
||||||
|
Organization *OrganizationService
|
||||||
|
ServiceDesk *ServiceDeskService
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewClient returns a new Jira API client.
|
// NewClient returns a new Jira API client.
|
||||||
@ -102,6 +104,8 @@ func NewClient(httpClient httpClient, baseURL string) (*Client, error) {
|
|||||||
c.PermissionScheme = &PermissionSchemeService{client: c}
|
c.PermissionScheme = &PermissionSchemeService{client: c}
|
||||||
c.Status = &StatusService{client: c}
|
c.Status = &StatusService{client: c}
|
||||||
c.IssueLinkType = &IssueLinkTypeService{client: c}
|
c.IssueLinkType = &IssueLinkTypeService{client: c}
|
||||||
|
c.Organization = &OrganizationService{client: c}
|
||||||
|
c.ServiceDesk = &ServiceDeskService{client: c}
|
||||||
|
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
387
organization.go
Normal file
387
organization.go
Normal file
@ -0,0 +1,387 @@
|
|||||||
|
package jira
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// OrganizationService handles Organizations for the Jira instance / API.
|
||||||
|
//
|
||||||
|
// Jira API docs: https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-organization/
|
||||||
|
type OrganizationService struct {
|
||||||
|
client *Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// OrganizationCreationDTO is DTO for creat organization API
|
||||||
|
type OrganizationCreationDTO struct {
|
||||||
|
Name string `json:"name,omitempty" structs:"name,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// SelfLink Stores REST API URL to the organization.
|
||||||
|
type SelfLink struct {
|
||||||
|
Self string `json:"self,omitempty" structs:"self,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Organization contains Organization data
|
||||||
|
type Organization struct {
|
||||||
|
ID string `json:"id,omitempty" structs:"id,omitempty"`
|
||||||
|
Name string `json:"name,omitempty" structs:"name,omitempty"`
|
||||||
|
Links *SelfLink `json:"_links,omitempty" structs:"_links,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// OrganizationUsersDTO contains organization user ids
|
||||||
|
type OrganizationUsersDTO struct {
|
||||||
|
AccountIds []string `json:"accountIds,omitempty" structs:"accountIds,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// PagedDTO is response of a paged list
|
||||||
|
type PagedDTO struct {
|
||||||
|
Size int `json:"size,omitempty" structs:"size,omitempty"`
|
||||||
|
Start int `json:"start,omitempty" structs:"start,omitempty"`
|
||||||
|
Limit int `limit:"size,omitempty" structs:"limit,omitempty"`
|
||||||
|
IsLastPage bool `json:"isLastPage,omitempty" structs:"isLastPage,omitempty"`
|
||||||
|
Values []interface{} `values:"isLastPage,omitempty" structs:"values,omitempty"`
|
||||||
|
Expands []string `json:"_expands,omitempty" structs:"_expands,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// PropertyKey contains Property key details.
|
||||||
|
type PropertyKey struct {
|
||||||
|
Self string `json:"self,omitempty" structs:"self,omitempty"`
|
||||||
|
Key string `json:"key,omitempty" structs:"key,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// PropertyKeys contains an array of PropertyKey
|
||||||
|
type PropertyKeys struct {
|
||||||
|
Keys []PropertyKey `json:"keys,omitempty" structs:"keys,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAllOrganizationsWithContext returns a list of organizations in
|
||||||
|
// the Jira Service Management instance.
|
||||||
|
// Use this method when you want to present a list
|
||||||
|
// of organizations or want to locate an organization
|
||||||
|
// by name.
|
||||||
|
//
|
||||||
|
// Jira API docs: https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-organization/#api-group-organization
|
||||||
|
func (s *OrganizationService) GetAllOrganizationsWithContext(ctx context.Context, start int, limit int, accountID string) (*PagedDTO, *Response, error) {
|
||||||
|
apiEndPoint := fmt.Sprintf("rest/servicedeskapi/organization?start=%d&limit=%d", start, limit)
|
||||||
|
if accountID != "" {
|
||||||
|
apiEndPoint += fmt.Sprintf("&accountId=%s", accountID)
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := s.client.NewRequestWithContext(ctx, "GET", apiEndPoint, nil)
|
||||||
|
req.Header.Set("Accept", "application/json")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
v := new(PagedDTO)
|
||||||
|
resp, err := s.client.Do(req, v)
|
||||||
|
if err != nil {
|
||||||
|
jerr := NewJiraError(resp, err)
|
||||||
|
return nil, resp, jerr
|
||||||
|
}
|
||||||
|
|
||||||
|
return v, resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAllOrganizations wraps GetAllOrganizationsWithContext using the background context.
|
||||||
|
func (s *OrganizationService) GetAllOrganizations(start int, limit int, accountID string) (*PagedDTO, *Response, error) {
|
||||||
|
return s.GetAllOrganizationsWithContext(context.Background(), start, limit, accountID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOrganizationWithContext creates an organization by
|
||||||
|
// passing the name of the organization.
|
||||||
|
//
|
||||||
|
// Jira API docs: https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-organization/#api-rest-servicedeskapi-organization-post
|
||||||
|
func (s *OrganizationService) CreateOrganizationWithContext(ctx context.Context, name string) (*Organization, *Response, error) {
|
||||||
|
apiEndPoint := "rest/servicedeskapi/organization"
|
||||||
|
|
||||||
|
organization := OrganizationCreationDTO{
|
||||||
|
Name: name,
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := s.client.NewRequestWithContext(ctx, "POST", apiEndPoint, organization)
|
||||||
|
req.Header.Set("Accept", "application/json")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
o := new(Organization)
|
||||||
|
resp, err := s.client.Do(req, &o)
|
||||||
|
if err != nil {
|
||||||
|
jerr := NewJiraError(resp, err)
|
||||||
|
return nil, resp, jerr
|
||||||
|
}
|
||||||
|
|
||||||
|
return o, resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOrganization wraps CreateOrganizationWithContext using the background context.
|
||||||
|
func (s *OrganizationService) CreateOrganization(name string) (*Organization, *Response, error) {
|
||||||
|
return s.CreateOrganizationWithContext(context.Background(), name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetOrganizationWithContext returns details of an
|
||||||
|
// organization. Use this method to get organization
|
||||||
|
// details whenever your application component is
|
||||||
|
// passed an organization ID but needs to display
|
||||||
|
// other organization details.
|
||||||
|
//
|
||||||
|
// Jira API docs: https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-organization/#api-rest-servicedeskapi-organization-organizationid-get
|
||||||
|
func (s *OrganizationService) GetOrganizationWithContext(ctx context.Context, organizationID int) (*Organization, *Response, error) {
|
||||||
|
apiEndPoint := fmt.Sprintf("rest/servicedeskapi/organization/%d", organizationID)
|
||||||
|
|
||||||
|
req, err := s.client.NewRequestWithContext(ctx, "GET", apiEndPoint, nil)
|
||||||
|
req.Header.Set("Accept", "application/json")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
o := new(Organization)
|
||||||
|
resp, err := s.client.Do(req, &o)
|
||||||
|
if err != nil {
|
||||||
|
jerr := NewJiraError(resp, err)
|
||||||
|
return nil, resp, jerr
|
||||||
|
}
|
||||||
|
|
||||||
|
return o, resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetOrganization wraps GetOrganizationWithContext using the background context.
|
||||||
|
func (s *OrganizationService) GetOrganization(organizationID int) (*Organization, *Response, error) {
|
||||||
|
return s.GetOrganizationWithContext(context.Background(), organizationID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteOrganizationWithContext deletes an organization. Note that
|
||||||
|
// the organization is deleted regardless
|
||||||
|
// of other associations it may have.
|
||||||
|
// For example, associations with service desks.
|
||||||
|
//
|
||||||
|
// Jira API docs: https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-organization/#api-rest-servicedeskapi-organization-organizationid-delete
|
||||||
|
func (s *OrganizationService) DeleteOrganizationWithContext(ctx context.Context, organizationID int) (*Response, error) {
|
||||||
|
apiEndPoint := fmt.Sprintf("rest/servicedeskapi/organization/%d", organizationID)
|
||||||
|
|
||||||
|
req, err := s.client.NewRequestWithContext(ctx, "DELETE", apiEndPoint, nil)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.Do(req, nil)
|
||||||
|
if err != nil {
|
||||||
|
jerr := NewJiraError(resp, err)
|
||||||
|
return resp, jerr
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteOrganization wraps DeleteOrganizationWithContext using the background context.
|
||||||
|
func (s *OrganizationService) DeleteOrganization(organizationID int) (*Response, error) {
|
||||||
|
return s.DeleteOrganizationWithContext(context.Background(), organizationID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPropertiesKeysWithContext returns the keys of
|
||||||
|
// all properties for an organization. Use this resource
|
||||||
|
// when you need to find out what additional properties
|
||||||
|
// items have been added to an organization.
|
||||||
|
//
|
||||||
|
// https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-organization/#api-rest-servicedeskapi-organization-organizationid-property-get
|
||||||
|
func (s *OrganizationService) GetPropertiesKeysWithContext(ctx context.Context, organizationID int) (*PropertyKeys, *Response, error) {
|
||||||
|
apiEndPoint := fmt.Sprintf("rest/servicedeskapi/organization/%d/property", organizationID)
|
||||||
|
|
||||||
|
req, err := s.client.NewRequestWithContext(ctx, "GET", apiEndPoint, nil)
|
||||||
|
req.Header.Set("Accept", "application/json")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
pk := new(PropertyKeys)
|
||||||
|
resp, err := s.client.Do(req, &pk)
|
||||||
|
if err != nil {
|
||||||
|
jerr := NewJiraError(resp, err)
|
||||||
|
return nil, resp, jerr
|
||||||
|
}
|
||||||
|
|
||||||
|
return pk, resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPropertiesKeys wraps GetPropertiesKeysWithContext using the background context.
|
||||||
|
func (s *OrganizationService) GetPropertiesKeys(organizationID int) (*PropertyKeys, *Response, error) {
|
||||||
|
return s.GetPropertiesKeysWithContext(context.Background(), organizationID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPropertyWithContext returns the value of a property
|
||||||
|
// from an organization. Use this method to obtain the JSON
|
||||||
|
// content for an organization's property.
|
||||||
|
//
|
||||||
|
// https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-organization/#api-rest-servicedeskapi-organization-organizationid-property-propertykey-get
|
||||||
|
func (s *OrganizationService) GetPropertyWithContext(ctx context.Context, organizationID int, propertyKey string) (*EntityProperty, *Response, error) {
|
||||||
|
apiEndPoint := fmt.Sprintf("rest/servicedeskapi/organization/%d/property/%s", organizationID, propertyKey)
|
||||||
|
|
||||||
|
req, err := s.client.NewRequestWithContext(ctx, "GET", apiEndPoint, nil)
|
||||||
|
req.Header.Set("Accept", "application/json")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ep := new(EntityProperty)
|
||||||
|
resp, err := s.client.Do(req, &ep)
|
||||||
|
if err != nil {
|
||||||
|
jerr := NewJiraError(resp, err)
|
||||||
|
return nil, resp, jerr
|
||||||
|
}
|
||||||
|
|
||||||
|
return ep, resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetProperty wraps GetPropertyWithContext using the background context.
|
||||||
|
func (s *OrganizationService) GetProperty(organizationID int, propertyKey string) (*EntityProperty, *Response, error) {
|
||||||
|
return s.GetPropertyWithContext(context.Background(), organizationID, propertyKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetPropertyWithContext sets the value of a
|
||||||
|
// property for an organization. Use this
|
||||||
|
// resource to store custom data against an organization.
|
||||||
|
//
|
||||||
|
// https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-organization/#api-rest-servicedeskapi-organization-organizationid-property-propertykey-put
|
||||||
|
func (s *OrganizationService) SetPropertyWithContext(ctx context.Context, organizationID int, propertyKey string) (*Response, error) {
|
||||||
|
apiEndPoint := fmt.Sprintf("rest/servicedeskapi/organization/%d/property/%s", organizationID, propertyKey)
|
||||||
|
|
||||||
|
req, err := s.client.NewRequestWithContext(ctx, "PUT", apiEndPoint, nil)
|
||||||
|
req.Header.Set("Accept", "application/json")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.Do(req, nil)
|
||||||
|
if err != nil {
|
||||||
|
jerr := NewJiraError(resp, err)
|
||||||
|
return resp, jerr
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetProperty wraps SetPropertyWithContext using the background context.
|
||||||
|
func (s *OrganizationService) SetProperty(organizationID int, propertyKey string) (*Response, error) {
|
||||||
|
return s.SetPropertyWithContext(context.Background(), organizationID, propertyKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeletePropertyWithContext removes a property from an organization.
|
||||||
|
//
|
||||||
|
// https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-organization/#api-rest-servicedeskapi-organization-organizationid-property-propertykey-delete
|
||||||
|
func (s *OrganizationService) DeletePropertyWithContext(ctx context.Context, organizationID int, propertyKey string) (*Response, error) {
|
||||||
|
apiEndPoint := fmt.Sprintf("rest/servicedeskapi/organization/%d/property/%s", organizationID, propertyKey)
|
||||||
|
|
||||||
|
req, err := s.client.NewRequestWithContext(ctx, "DELETE", apiEndPoint, nil)
|
||||||
|
req.Header.Set("Accept", "application/json")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.Do(req, nil)
|
||||||
|
if err != nil {
|
||||||
|
jerr := NewJiraError(resp, err)
|
||||||
|
return resp, jerr
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteProperty wraps DeletePropertyWithContext using the background context.
|
||||||
|
func (s *OrganizationService) DeleteProperty(organizationID int, propertyKey string) (*Response, error) {
|
||||||
|
return s.DeletePropertyWithContext(context.Background(), organizationID, propertyKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUsersWithContext returns all the users
|
||||||
|
// associated with an organization. Use this
|
||||||
|
// method where you want to provide a list of
|
||||||
|
// users for an organization or determine if
|
||||||
|
// a user is associated with an organization.
|
||||||
|
//
|
||||||
|
// https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-organization/#api-rest-servicedeskapi-organization-organizationid-user-get
|
||||||
|
func (s *OrganizationService) GetUsersWithContext(ctx context.Context, organizationID int, start int, limit int) (*PagedDTO, *Response, error) {
|
||||||
|
apiEndPoint := fmt.Sprintf("rest/servicedeskapi/organization/%d/user?start=%d&limit=%d", organizationID, start, limit)
|
||||||
|
|
||||||
|
req, err := s.client.NewRequestWithContext(ctx, "GET", apiEndPoint, nil)
|
||||||
|
req.Header.Set("Accept", "application/json")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
users := new(PagedDTO)
|
||||||
|
resp, err := s.client.Do(req, &users)
|
||||||
|
if err != nil {
|
||||||
|
jerr := NewJiraError(resp, err)
|
||||||
|
return nil, resp, jerr
|
||||||
|
}
|
||||||
|
|
||||||
|
return users, resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUsers wraps GetUsersWithContext using the background context.
|
||||||
|
func (s *OrganizationService) GetUsers(organizationID int, start int, limit int) (*PagedDTO, *Response, error) {
|
||||||
|
return s.GetUsersWithContext(context.Background(), organizationID, start, limit)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddUsersWithContext adds users to an organization.
|
||||||
|
//
|
||||||
|
// https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-organization/#api-rest-servicedeskapi-organization-organizationid-user-post
|
||||||
|
func (s *OrganizationService) AddUsersWithContext(ctx context.Context, organizationID int, users OrganizationUsersDTO) (*Response, error) {
|
||||||
|
apiEndPoint := fmt.Sprintf("rest/servicedeskapi/organization/%d/user", organizationID)
|
||||||
|
|
||||||
|
req, err := s.client.NewRequestWithContext(ctx, "POST", apiEndPoint, users)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.Do(req, nil)
|
||||||
|
if err != nil {
|
||||||
|
jerr := NewJiraError(resp, err)
|
||||||
|
return resp, jerr
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddUsers wraps AddUsersWithContext using the background context.
|
||||||
|
func (s *OrganizationService) AddUsers(organizationID int, users OrganizationUsersDTO) (*Response, error) {
|
||||||
|
return s.AddUsersWithContext(context.Background(), organizationID, users)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveUsersWithContext removes users from an organization.
|
||||||
|
//
|
||||||
|
// https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-organization/#api-rest-servicedeskapi-organization-organizationid-user-delete
|
||||||
|
func (s *OrganizationService) RemoveUsersWithContext(ctx context.Context, organizationID int, users OrganizationUsersDTO) (*Response, error) {
|
||||||
|
apiEndPoint := fmt.Sprintf("rest/servicedeskapi/organization/%d/user", organizationID)
|
||||||
|
|
||||||
|
req, err := s.client.NewRequestWithContext(ctx, "DELETE", apiEndPoint, nil)
|
||||||
|
req.Header.Set("Accept", "application/json")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.Do(req, nil)
|
||||||
|
if err != nil {
|
||||||
|
jerr := NewJiraError(resp, err)
|
||||||
|
return resp, jerr
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveUsers wraps RemoveUsersWithContext using the background context.
|
||||||
|
func (s *OrganizationService) RemoveUsers(organizationID int, users OrganizationUsersDTO) (*Response, error) {
|
||||||
|
return s.RemoveUsersWithContext(context.Background(), organizationID, users)
|
||||||
|
}
|
337
organization_test.go
Normal file
337
organization_test.go
Normal file
@ -0,0 +1,337 @@
|
|||||||
|
package jira
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestOrganizationService_GetAllOrganizationsWithContext(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
testMux.HandleFunc("/rest/servicedeskapi/organization", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
testMethod(t, r, "GET")
|
||||||
|
testRequestURL(t, r, "/rest/servicedeskapi/organization")
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
fmt.Fprint(w, `{ "_expands": [], "size": 1, "start": 1, "limit": 1, "isLastPage": false, "_links": { "base": "https://your-domain.atlassian.net/rest/servicedeskapi", "context": "context", "next": "https://your-domain.atlassian.net/rest/servicedeskapi/organization?start=2&limit=1", "prev": "https://your-domain.atlassian.net/rest/servicedeskapi/organization?start=0&limit=1" }, "values": [ { "id": "1", "name": "Charlie Cakes Franchises", "_links": { "self": "https://your-domain.atlassian.net/rest/servicedeskapi/organization/1" } } ] }`)
|
||||||
|
})
|
||||||
|
|
||||||
|
result, _, err := testClient.Organization.GetAllOrganizations(0, 50, "")
|
||||||
|
|
||||||
|
if result == nil {
|
||||||
|
t.Error("Expected Organizations. Result is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
if result.Size != 1 {
|
||||||
|
t.Errorf("Expected size to be 1, but got %d", result.Size)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error given: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrganizationService_CreateOrganization(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
testMux.HandleFunc("/rest/servicedeskapi/organization", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
testMethod(t, r, "POST")
|
||||||
|
testRequestURL(t, r, "/rest/servicedeskapi/organization")
|
||||||
|
|
||||||
|
o := new(OrganizationCreationDTO)
|
||||||
|
json.NewDecoder(r.Body).Decode(&o)
|
||||||
|
w.WriteHeader(http.StatusCreated)
|
||||||
|
fmt.Fprintf(w, `{ "id": "1", "name": "%s", "_links": { "self": "https://your-domain.atlassian.net/rest/servicedeskapi/organization/1" } }`, o.Name)
|
||||||
|
})
|
||||||
|
|
||||||
|
name := "MyOrg"
|
||||||
|
o, _, err := testClient.Organization.CreateOrganization(name)
|
||||||
|
|
||||||
|
if o == nil {
|
||||||
|
t.Error("Expected Organization. Result is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
if o.Name != name {
|
||||||
|
t.Errorf("Expected name to be %s, but got %s", name, o.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error given: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrganizationService_GetOrganization(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
testMux.HandleFunc("/rest/servicedeskapi/organization/1", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
testMethod(t, r, "GET")
|
||||||
|
testRequestURL(t, r, "/rest/servicedeskapi/organization/1")
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
fmt.Fprintf(w, `{ "id": "1", "name": "name", "_links": { "self": "https://your-domain.atlassian.net/rest/servicedeskapi/organization/1" } }`)
|
||||||
|
})
|
||||||
|
|
||||||
|
id := 1
|
||||||
|
o, _, err := testClient.Organization.GetOrganization(id)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error given: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if o == nil {
|
||||||
|
t.Error("Expected Organization. Result is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
if o.Name != "name" {
|
||||||
|
t.Errorf("Expected name to be name, but got %s", o.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrganizationService_DeleteOrganization(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
testMux.HandleFunc("/rest/servicedeskapi/organization/1", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
testMethod(t, r, "DELETE")
|
||||||
|
testRequestURL(t, r, "/rest/servicedeskapi/organization/1")
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusNoContent)
|
||||||
|
})
|
||||||
|
|
||||||
|
_, err := testClient.Organization.DeleteOrganization(1)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error given: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrganizationService_GetPropertiesKeys(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
testMux.HandleFunc("/rest/servicedeskapi/organization/1/property", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
testMethod(t, r, "GET")
|
||||||
|
testRequestURL(t, r, "/rest/servicedeskapi/organization/1/property")
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
fmt.Fprintf(w, `{
|
||||||
|
"keys": [
|
||||||
|
{
|
||||||
|
"self": "/rest/servicedeskapi/organization/1/property/propertyKey",
|
||||||
|
"key": "organization.attributes"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}`)
|
||||||
|
})
|
||||||
|
|
||||||
|
pk, _, err := testClient.Organization.GetPropertiesKeys(1)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error given: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if pk == nil {
|
||||||
|
t.Error("Expected Keys. Result is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
if pk.Keys[0].Key != "organization.attributes" {
|
||||||
|
t.Errorf("Expected name to be organization.attributes, but got %s", pk.Keys[0].Key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrganizationService_GetProperty(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
testMux.HandleFunc("/rest/servicedeskapi/organization/1/property/organization.attributes", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
testMethod(t, r, "GET")
|
||||||
|
testRequestURL(t, r, "/rest/servicedeskapi/organization/1/property/organization.attributes")
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
fmt.Fprintf(w, `{
|
||||||
|
"key": "organization.attributes",
|
||||||
|
"value": {
|
||||||
|
"phone": "0800-1233456789",
|
||||||
|
"mail": "charlie@example.com"
|
||||||
|
}
|
||||||
|
}`)
|
||||||
|
})
|
||||||
|
|
||||||
|
key := "organization.attributes"
|
||||||
|
ep, _, err := testClient.Organization.GetProperty(1, key)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error given: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ep == nil {
|
||||||
|
t.Error("Expected Entity. Result is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
if ep.Key != key {
|
||||||
|
t.Errorf("Expected name to be %s, but got %s", key, ep.Key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrganizationService_SetProperty(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
testMux.HandleFunc("/rest/servicedeskapi/organization/1/property/organization.attributes", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
testMethod(t, r, "PUT")
|
||||||
|
testRequestURL(t, r, "/rest/servicedeskapi/organization/1/property/organization.attributes")
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
})
|
||||||
|
|
||||||
|
key := "organization.attributes"
|
||||||
|
_, err := testClient.Organization.SetProperty(1, key)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error given: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrganizationService_DeleteProperty(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
testMux.HandleFunc("/rest/servicedeskapi/organization/1/property/organization.attributes", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
testMethod(t, r, "DELETE")
|
||||||
|
testRequestURL(t, r, "/rest/servicedeskapi/organization/1/property/organization.attributes")
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
})
|
||||||
|
|
||||||
|
key := "organization.attributes"
|
||||||
|
_, err := testClient.Organization.DeleteProperty(1, key)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error given: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrganizationService_GetUsers(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
testMux.HandleFunc("/rest/servicedeskapi/organization/1/user", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
testMethod(t, r, "GET")
|
||||||
|
testRequestURL(t, r, "/rest/servicedeskapi/organization/1/user")
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
fmt.Fprintf(w, `{
|
||||||
|
"_expands": [],
|
||||||
|
"size": 1,
|
||||||
|
"start": 1,
|
||||||
|
"limit": 1,
|
||||||
|
"isLastPage": false,
|
||||||
|
"_links": {
|
||||||
|
"base": "https://your-domain.atlassian.net/rest/servicedeskapi",
|
||||||
|
"context": "context",
|
||||||
|
"next": "https://your-domain.atlassian.net/rest/servicedeskapi/organization/1/user?start=2&limit=1",
|
||||||
|
"prev": "https://your-domain.atlassian.net/rest/servicedeskapi/organization/1/user?start=0&limit=1"
|
||||||
|
},
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"accountId": "qm:a713c8ea-1075-4e30-9d96-891a7d181739:5ad6d3581db05e2a66fa80b",
|
||||||
|
"name": "qm:a713c8ea-1075-4e30-9d96-891a7d181739:5ad6d3581db05e2a66fa80b",
|
||||||
|
"key": "qm:a713c8ea-1075-4e30-9d96-891a7d181739:5ad6d3581db05e2a66fa80b",
|
||||||
|
"emailAddress": "fred@example.com",
|
||||||
|
"displayName": "Fred F. User",
|
||||||
|
"active": true,
|
||||||
|
"timeZone": "Australia/Sydney",
|
||||||
|
"_links": {
|
||||||
|
"jiraRest": "https://your-domain.atlassian.net/rest/api/2/user?username=qm:a713c8ea-1075-4e30-9d96-891a7d181739:5ad6d3581db05e2a66fa80b",
|
||||||
|
"avatarUrls": {
|
||||||
|
"48x48": "https://avatar-cdn.atlassian.com/9bc3b5bcb0db050c6d7660b28a5b86c9?s=48",
|
||||||
|
"24x24": "https://avatar-cdn.atlassian.com/9bc3b5bcb0db050c6d7660b28a5b86c9?s=24",
|
||||||
|
"16x16": "https://avatar-cdn.atlassian.com/9bc3b5bcb0db050c6d7660b28a5b86c9?s=16",
|
||||||
|
"32x32": "https://avatar-cdn.atlassian.com/9bc3b5bcb0db050c6d7660b28a5b86c9?s=32"
|
||||||
|
},
|
||||||
|
"self": "https://your-domain.atlassian.net/rest/api/2/user?username=qm:a713c8ea-1075-4e30-9d96-891a7d181739:5ad6d3581db05e2a66fa80b"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"accountId": "qm:a713c8ea-1075-4e30-9d96-891a7d181739:5ad6d3a01db05e2a66fa80bd",
|
||||||
|
"name": "qm:a713c8ea-1075-4e30-9d96-891a7d181739:5ad6d3a01db05e2a66fa80bd",
|
||||||
|
"key": "qm:a713c8ea-1075-4e30-9d96-891a7d181739:5ad6d3a01db05e2a66fa80bd",
|
||||||
|
"emailAddress": "bob@example.com",
|
||||||
|
"displayName": "Bob D. Builder",
|
||||||
|
"active": true,
|
||||||
|
"timeZone": "Australia/Sydney",
|
||||||
|
"_links": {
|
||||||
|
"jiraRest": "https://your-domain.atlassian.net/rest/api/2/user?username=qm:a713c8ea-1075-4e30-9d96-891a7d181739:5ad6d3a01db05e2a66fa80bd",
|
||||||
|
"avatarUrls": {
|
||||||
|
"48x48": "https://avatar-cdn.atlassian.com/9bc3b5bcb0db050c6d7660b28a5b86c9?s=48",
|
||||||
|
"24x24": "https://avatar-cdn.atlassian.com/9bc3b5bcb0db050c6d7660b28a5b86c9?s=24",
|
||||||
|
"16x16": "https://avatar-cdn.atlassian.com/9bc3b5bcb0db050c6d7660b28a5b86c9?s=16",
|
||||||
|
"32x32": "https://avatar-cdn.atlassian.com/9bc3b5bcb0db050c6d7660b28a5b86c9?s=32"
|
||||||
|
},
|
||||||
|
"self": "https://your-domain.atlassian.net/rest/api/2/user?username=qm:a713c8ea-1075-4e30-9d96-891a7d181739:5ad6d3a01db05e2a66fa80bd"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}`)
|
||||||
|
})
|
||||||
|
|
||||||
|
users, _, err := testClient.Organization.GetUsers(1, 0, 50)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error given: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if users == nil {
|
||||||
|
t.Error("Expected Organizations. Result is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
if users.Size != 1 {
|
||||||
|
t.Errorf("Expected size to be 1, but got %d", users.Size)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error given: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrganizationService_AddUsers(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
testMux.HandleFunc("/rest/servicedeskapi/organization/1/user", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
testMethod(t, r, "POST")
|
||||||
|
testRequestURL(t, r, "/rest/servicedeskapi/organization/1/user")
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusNoContent)
|
||||||
|
})
|
||||||
|
|
||||||
|
users := OrganizationUsersDTO{
|
||||||
|
AccountIds: []string{
|
||||||
|
"qm:a713c8ea-1075-4e30-9d96-891a7d181739:5ad6d3581db05e2a66fa80b",
|
||||||
|
"qm:a713c8ea-1075-4e30-9d96-891a7d181739:5ad6d3a01db05e2a66fa80bd",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
_, err := testClient.Organization.AddUsers(1, users)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error given: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrganizationService_RemoveUsers(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
testMux.HandleFunc("/rest/servicedeskapi/organization/1/user", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
testMethod(t, r, "DELETE")
|
||||||
|
testRequestURL(t, r, "/rest/servicedeskapi/organization/1/user")
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusNoContent)
|
||||||
|
})
|
||||||
|
|
||||||
|
users := OrganizationUsersDTO{
|
||||||
|
AccountIds: []string{
|
||||||
|
"qm:a713c8ea-1075-4e30-9d96-891a7d181739:5ad6d3581db05e2a66fa80b",
|
||||||
|
"qm:a713c8ea-1075-4e30-9d96-891a7d181739:5ad6d3a01db05e2a66fa80bd",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
_, err := testClient.Organization.RemoveUsers(1, users)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error given: %s", err)
|
||||||
|
}
|
||||||
|
}
|
114
servicedesk.go
Normal file
114
servicedesk.go
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
package jira
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ServiceDeskService handles ServiceDesk for the Jira instance / API.
|
||||||
|
type ServiceDeskService struct {
|
||||||
|
client *Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServiceDeskOrganizationDTO is a DTO for ServiceDesk organizations
|
||||||
|
type ServiceDeskOrganizationDTO struct {
|
||||||
|
OrganizationID int `json:"organizationId,omitempty" structs:"organizationId,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetOrganizationsWithContext returns a list of
|
||||||
|
// all organizations associated with a service desk.
|
||||||
|
//
|
||||||
|
// https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-organization/#api-rest-servicedeskapi-servicedesk-servicedeskid-organization-get
|
||||||
|
func (s *ServiceDeskService) GetOrganizationsWithContext(ctx context.Context, serviceDeskID int, start int, limit int, accountID string) (*PagedDTO, *Response, error) {
|
||||||
|
apiEndPoint := fmt.Sprintf("rest/servicedeskapi/servicedesk/%d/organization?start=%d&limit=%d", serviceDeskID, start, limit)
|
||||||
|
if accountID != "" {
|
||||||
|
apiEndPoint += fmt.Sprintf("&accountId=%s", accountID)
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := s.client.NewRequestWithContext(ctx, "GET", apiEndPoint, nil)
|
||||||
|
req.Header.Set("Accept", "application/json")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
orgs := new(PagedDTO)
|
||||||
|
resp, err := s.client.Do(req, &orgs)
|
||||||
|
if err != nil {
|
||||||
|
jerr := NewJiraError(resp, err)
|
||||||
|
return nil, resp, jerr
|
||||||
|
}
|
||||||
|
|
||||||
|
return orgs, resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetOrganizations wraps GetOrganizationsWithContext using the background context.
|
||||||
|
func (s *ServiceDeskService) GetOrganizations(serviceDeskID int, start int, limit int, accountID string) (*PagedDTO, *Response, error) {
|
||||||
|
return s.GetOrganizationsWithContext(context.Background(), serviceDeskID, start, limit, accountID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddOrganizationWithContext adds an organization to
|
||||||
|
// a service desk. If the organization ID is already
|
||||||
|
// associated with the service desk, no change is made
|
||||||
|
// and the resource returns a 204 success code.
|
||||||
|
//
|
||||||
|
// https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-organization/#api-rest-servicedeskapi-servicedesk-servicedeskid-organization-post
|
||||||
|
func (s *ServiceDeskService) AddOrganizationWithContext(ctx context.Context, serviceDeskID int, organizationID int) (*Response, error) {
|
||||||
|
apiEndPoint := fmt.Sprintf("rest/servicedeskapi/servicedesk/%d/organization", serviceDeskID)
|
||||||
|
|
||||||
|
organization := ServiceDeskOrganizationDTO{
|
||||||
|
OrganizationID: organizationID,
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := s.client.NewRequestWithContext(ctx, "POST", apiEndPoint, organization)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.Do(req, nil)
|
||||||
|
if err != nil {
|
||||||
|
jerr := NewJiraError(resp, err)
|
||||||
|
return resp, jerr
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddOrganization wraps AddOrganizationWithContext using the background context.
|
||||||
|
func (s *ServiceDeskService) AddOrganization(serviceDeskID int, organizationID int) (*Response, error) {
|
||||||
|
return s.AddOrganizationWithContext(context.Background(), serviceDeskID, organizationID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveOrganizationWithContext removes an organization
|
||||||
|
// from a service desk. If the organization ID does not
|
||||||
|
// match an organization associated with the service desk,
|
||||||
|
// no change is made and the resource returns a 204 success code.
|
||||||
|
//
|
||||||
|
// https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-organization/#api-rest-servicedeskapi-servicedesk-servicedeskid-organization-delete
|
||||||
|
func (s *ServiceDeskService) RemoveOrganizationWithContext(ctx context.Context, serviceDeskID int, organizationID int) (*Response, error) {
|
||||||
|
apiEndPoint := fmt.Sprintf("rest/servicedeskapi/servicedesk/%d/organization", serviceDeskID)
|
||||||
|
|
||||||
|
organization := ServiceDeskOrganizationDTO{
|
||||||
|
OrganizationID: organizationID,
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := s.client.NewRequestWithContext(ctx, "DELETE", apiEndPoint, organization)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.Do(req, nil)
|
||||||
|
if err != nil {
|
||||||
|
jerr := NewJiraError(resp, err)
|
||||||
|
return resp, jerr
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveOrganization wraps RemoveOrganizationWithContext using the background context.
|
||||||
|
func (s *ServiceDeskService) RemoveOrganization(serviceDeskID int, organizationID int) (*Response, error) {
|
||||||
|
return s.RemoveOrganizationWithContext(context.Background(), serviceDeskID, organizationID)
|
||||||
|
}
|
102
servicedesk_test.go
Normal file
102
servicedesk_test.go
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
package jira
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestServiceDeskService_GetOrganizations(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
testMux.HandleFunc("/rest/servicedeskapi/servicedesk/10001/organization", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
testMethod(t, r, "GET")
|
||||||
|
testRequestURL(t, r, "/rest/servicedeskapi/servicedesk/10001/organization")
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
fmt.Fprint(w, `{
|
||||||
|
"_expands": [],
|
||||||
|
"size": 3,
|
||||||
|
"start": 3,
|
||||||
|
"limit": 3,
|
||||||
|
"isLastPage": false,
|
||||||
|
"_links": {
|
||||||
|
"base": "https://your-domain.atlassian.net/rest/servicedeskapi",
|
||||||
|
"context": "context",
|
||||||
|
"next": "https://your-domain.atlassian.net/rest/servicedeskapi/servicedesk/10001/organization?start=6&limit=3",
|
||||||
|
"prev": "https://your-domain.atlassian.net/rest/servicedeskapi/servicedesk/10001/organization?start=0&limit=3"
|
||||||
|
},
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"name": "Charlie Cakes Franchises",
|
||||||
|
"_links": {
|
||||||
|
"self": "https://your-domain.atlassian.net/rest/servicedeskapi/organization/1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2",
|
||||||
|
"name": "Atlas Coffee Co",
|
||||||
|
"_links": {
|
||||||
|
"self": "https://your-domain.atlassian.net/rest/servicedeskapi/organization/2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3",
|
||||||
|
"name": "The Adjustment Bureau",
|
||||||
|
"_links": {
|
||||||
|
"self": "https://your-domain.atlassian.net/rest/servicedeskapi/organization/3"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}`)
|
||||||
|
})
|
||||||
|
|
||||||
|
orgs, _, err := testClient.ServiceDesk.GetOrganizations(10001, 3, 3, "")
|
||||||
|
|
||||||
|
if orgs == nil {
|
||||||
|
t.Error("Expected Organizations. Result is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
if orgs.Size != 3 {
|
||||||
|
t.Errorf("Expected size to be 3, but got %d", orgs.Size)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error given: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestServiceDeskService_AddOrganizations(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
testMux.HandleFunc("/rest/servicedeskapi/servicedesk/10001/organization", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
testMethod(t, r, "POST")
|
||||||
|
testRequestURL(t, r, "/rest/servicedeskapi/servicedesk/10001/organization")
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusNoContent)
|
||||||
|
})
|
||||||
|
|
||||||
|
_, err := testClient.ServiceDesk.AddOrganization(10001, 1)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error given: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestServiceDeskService_RemoveOrganizations(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
defer teardown()
|
||||||
|
testMux.HandleFunc("/rest/servicedeskapi/servicedesk/10001/organization", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
testMethod(t, r, "DELETE")
|
||||||
|
testRequestURL(t, r, "/rest/servicedeskapi/servicedesk/10001/organization")
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusNoContent)
|
||||||
|
})
|
||||||
|
|
||||||
|
_, err := testClient.ServiceDesk.RemoveOrganization(10001, 1)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error given: %s", err)
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user