Repository: ctreminiom/go-atlassian
Pull request #59 (2021-08-13 20:43:35)

Dev


Patch:
diff --git a/confluence/confluence.go b/confluence/confluence.go
index 7d25c60..7b32ac5 100644
--- a/confluence/confluence.go
+++ b/confluence/confluence.go
@@ -20,7 +20,7 @@ type Client struct {
 
 	Auth    *AuthenticationService
 	Content *ContentService
-	Space *SpaceService
+	Space   *SpaceService
 }
 
 func New(httpClient *http.Client, site string) (client *Client, err error) {
@@ -44,11 +44,13 @@ func New(httpClient *http.Client, site string) (client *Client, err error) {
 	client.Auth = &AuthenticationService{client: client}
 
 	client.Content = &ContentService{
-		client: client,
-		Attachment: &ContentAttachmentService{client: client},
+		client:             client,
+		Attachment:         &ContentAttachmentService{client: client},
 		ChildrenDescendant: &ContentChildrenDescendantService{client: client},
-		Comment: &ContentCommentService{client: client},
-		Permission: &ContentPermissionService{client: client},
+		Comment:            &ContentCommentService{client: client},
+		Permission:         &ContentPermissionService{client: client},
+		Label:              &ContentLabelService{client: client},
+		Property:           &ContentPropertyService{client: client},
 	}
 
 	client.Space = &SpaceService{client: client}
diff --git a/confluence/content.go b/confluence/content.go
index 71cffa4..fea4ab9 100644
--- a/confluence/content.go
+++ b/confluence/content.go
@@ -11,11 +11,13 @@ import (
 )
 
 type ContentService struct {
-	client *Client
-	Attachment *ContentAttachmentService
+	client             *Client
+	Attachment         *ContentAttachmentService
 	ChildrenDescendant *ContentChildrenDescendantService
-	Comment *ContentCommentService
-	Permission *ContentPermissionService
+	Comment            *ContentCommentService
+	Permission         *ContentPermissionService
+	Label              *ContentLabelService
+	Property           *ContentPropertyService
 }
 
 type GetContentOptionsScheme struct {
@@ -34,29 +36,29 @@ type ContentPageScheme struct {
 }
 
 type LinkScheme struct {
-	Base    string `json:"base,omitempty"`
-	Context string `json:"context,omitempty"`
-	Self    string `json:"self,omitempty"`
-	Tinyui  string `json:"tinyui,omitempty"`
-	Editui  string `json:"editui,omitempty"`
-	Webui   string `json:"webui,omitempty"`
+	Base     string `json:"base,omitempty"`
+	Context  string `json:"context,omitempty"`
+	Self     string `json:"self,omitempty"`
+	Tinyui   string `json:"tinyui,omitempty"`
+	Editui   string `json:"editui,omitempty"`
+	Webui    string `json:"webui,omitempty"`
 	Download string `json:"download,omitempty"`
-	Next    string `json:"next"`
+	Next     string `json:"next"`
 }
 
 type ContentScheme struct {
-	ID         string             `json:"id,omitempty"`
-	Type       string             `json:"type,omitempty"`
-	Status     string             `json:"status,omitempty"`
-	Title      string             `json:"title,omitempty"`
-	Expandable *ExpandableScheme  `json:"_expandable,omitempty"`
-	Links      *LinkScheme        `json:"_links,omitempty"`
-	ChildTypes *ChildTypesScheme  `json:"childTypes,omitempty"`
-	Space      *SpaceScheme       `json:"space,omitempty"`
-	Metadata   *MetadataScheme    `json:"metadata,omitempty"`
-	Operations []*OperationScheme `json:"operations,omitempty"`
-	Body       *BodyScheme        `json:"body,omitempty"`
-	Version    *VersionScheme     `json:"version,omitempty"`
+	ID         string                  `json:"id,omitempty"`
+	Type       string                  `json:"type,omitempty"`
+	Status     string                  `json:"status,omitempty"`
+	Title      string                  `json:"title,omitempty"`
+	Expandable *ExpandableScheme       `json:"_expandable,omitempty"`
+	Links      *LinkScheme             `json:"_links,omitempty"`
+	ChildTypes *ChildTypesScheme       `json:"childTypes,omitempty"`
+	Space      *SpaceScheme            `json:"space,omitempty"`
+	Metadata   *MetadataScheme         `json:"metadata,omitempty"`
+	Operations []*OperationScheme      `json:"operations,omitempty"`
+	Body       *BodyScheme             `json:"body,omitempty"`
+	Version    *VersionScheme          `json:"version,omitempty"`
 	Extensions *ContentExtensionScheme `json:"extensions,omitempty"`
 }
 
@@ -111,7 +113,7 @@ type OperationScheme struct {
 type MetadataScheme struct {
 	Labels     *LabelsScheme     `json:"labels"`
 	Expandable *ExpandableScheme `json:"_expandable,omitempty"`
-	MediaType string `json:"mediaType,omitempty"`
+	MediaType  string            `json:"mediaType,omitempty"`
 }
 
 type LabelsScheme struct {
diff --git a/confluence/contentLabels.go b/confluence/contentLabels.go
new file mode 100644
index 0000000..5915b09
--- /dev/null
+++ b/confluence/contentLabels.go
@@ -0,0 +1,140 @@
+package confluence
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type ContentLabelService struct {
+	client *Client
+}
+
+// Gets returns the labels on a piece of content.
+// Atlassian Docs: https://developer.atlassian.com/cloud/confluence/rest/api-group-content-labels/#api-wiki-rest-api-content-id-label-get
+func (c *ContentLabelService) Gets(ctx context.Context, contentID, prefix string, startAt, maxResults int) (result *ContentLabelPageScheme,
+	response *ResponseScheme, err error) {
+
+	if len(contentID) == 0 {
+		return nil, nil, notContentIDError
+	}
+
+	query := url.Values{}
+	query.Add("start", strconv.Itoa(startAt))
+	query.Add("limit", strconv.Itoa(maxResults))
+
+	if len(prefix) != 0 {
+		query.Add("prefix", prefix)
+	}
+
+	var endpoint = fmt.Sprintf("wiki/rest/api/content/%v/label?%v", contentID, query.Encode())
+
+	request, err := c.client.newRequest(ctx, http.MethodGet, endpoint, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	request.Header.Set("Accept", "application/json")
+
+	response, err = c.client.Call(request, &result)
+	if err != nil {
+		return nil, response, err
+	}
+
+	return
+}
+
+// Add adds labels to a piece of content. Does not modify the existing labels.
+// Atlassian Docs: https://developer.atlassian.com/cloud/confluence/rest/api-group-content-labels/#api-wiki-rest-api-content-id-label-post
+func (c *ContentLabelService) Add(ctx context.Context, contentID string, payload []*ContentLabelPayloadScheme, want400Response bool) (
+	result *ContentLabelPageScheme, response *ResponseScheme, err error) {
+
+	if len(contentID) == 0 {
+		return nil, nil, notContentIDError
+	}
+
+	payloadAsReader, err := transformStructToReader(payload)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var endpoint strings.Builder
+	endpoint.WriteString(fmt.Sprintf("/wiki/rest/api/content/%v/label", contentID))
+
+	query := url.Values{}
+	if want400Response {
+		query.Add("use-400-error-response", "true")
+	}
+
+	if query.Encode() != "" {
+		endpoint.WriteString(fmt.Sprintf("?%v", query.Encode()))
+	}
+
+	request, err := c.client.newRequest(ctx, http.MethodPost, endpoint.String(), payloadAsReader)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	request.Header.Set("Accept", "application/json")
+	request.Header.Set("Content-Type", "application/json")
+
+	response, err = c.client.Call(request, &result)
+	if err != nil {
+		return nil, response, err
+	}
+
+	return
+}
+
+// Remove removes a label from a piece of content
+// Atlassian Docs: https://developer.atlassian.com/cloud/confluence/rest/api-group-content-labels/#api-wiki-rest-api-content-id-label-label-delete
+func (c *ContentLabelService) Remove(ctx context.Context, contentID, labelName string) (response *ResponseScheme, err error) {
+
+	if len(contentID) == 0 {
+		return nil, notContentIDError
+	}
+
+	if len(labelName) == 0 {
+		return nil, notLabelNameError
+	}
+
+	var endpoint = fmt.Sprintf("/wiki/rest/api/content/%v/label/%v", contentID, labelName)
+
+	request, err := c.client.newRequest(ctx, http.MethodDelete, endpoint, nil)
+	if err != nil {
+		return nil, err
+	}
+
+	response, err = c.client.Call(request, nil)
+	if err != nil {
+		return response, err
+	}
+
+	return
+}
+
+type ContentLabelPayloadScheme struct {
+	Prefix string `json:"prefix"`
+	Name   string `json:"name"`
+}
+
+type ContentLabelPageScheme struct {
+	Results []*ContentLabelScheme `json:"results,omitempty"`
+	Start   int                   `json:"start,omitempty"`
+	Limit   int                   `json:"limit,omitempty"`
+	Size    int                   `json:"size,omitempty"`
+}
+
+type ContentLabelScheme struct {
+	Prefix string `json:"prefix,omitempty"`
+	Name   string `json:"name,omitempty"`
+	ID     string `json:"id,omitempty"`
+	Label  string `json:"label,omitempty"`
+}
+
+var (
+	notLabelNameError = fmt.Errorf("error!, please provide a label name")
+)
diff --git a/confluence/contentProperties.go b/confluence/contentProperties.go
new file mode 100644
index 0000000..bbc8b0d
--- /dev/null
+++ b/confluence/contentProperties.go
@@ -0,0 +1,170 @@
+package confluence
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type ContentPropertyService struct{ client *Client }
+
+// Gets returns the properties for a piece of content.
+// Atlassian Docs: https://developer.atlassian.com/cloud/confluence/rest/api-group-content-properties/#api-wiki-rest-api-content-id-property-get
+func (c *ContentPropertyService) Gets(ctx context.Context, contentID string, expand []string, startAt, maxResults int) (
+	result *ContentPropertyPageScheme, response *ResponseScheme, err error) {
+
+	if len(contentID) == 0 {
+		return nil, nil, notContentIDError
+	}
+
+	query := url.Values{}
+	query.Add("start", strconv.Itoa(startAt))
+	query.Add("limit", strconv.Itoa(maxResults))
+
+	if len(expand) != 0 {
+		query.Add("expand", strings.Join(expand, ","))
+	}
+
+	var endpoint = fmt.Sprintf("/wiki/rest/api/content/%v/property?%v", contentID, query.Encode())
+
+	request, err := c.client.newRequest(ctx, http.MethodGet, endpoint, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	request.Header.Set("Accept", "application/json")
+
+	response, err = c.client.Call(request, &result)
+	if err != nil {
+		return nil, response, err
+	}
+
+	return
+}
+
+// Create creates a property for an existing piece of content.
+// Atlassian Docs: https://developer.atlassian.com/cloud/confluence/rest/api-group-content-properties/#api-wiki-rest-api-content-id-property-post
+func (c *ContentPropertyService) Create(ctx context.Context, contentID string, payload *ContentPropertyPayloadScheme) (
+	result *ContentPropertyScheme, response *ResponseScheme, err error) {
+
+	if len(contentID) == 0 {
+		return nil, nil, notContentIDError
+	}
+
+	payloadAsReader, err := transformStructToReader(payload)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var endpoint = fmt.Sprintf("/wiki/rest/api/content/%v/property", contentID)
+
+	request, err := c.client.newRequest(ctx, http.MethodPost, endpoint, payloadAsReader)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	request.Header.Set("Accept", "application/json")
+	request.Header.Set("Content-Type", "application/json")
+
+	response, err = c.client.Call(request, &result)
+	if err != nil {
+		return nil, response, err
+	}
+
+	return
+}
+
+// Get returns a content property for a piece of content.
+// Atlassian Docs: https://developer.atlassian.com/cloud/confluence/rest/api-group-content-properties/#api-wiki-rest-api-content-id-property-key-get
+func (c *ContentPropertyService) Get(ctx context.Context, contentID, key string) (result *ContentPropertyScheme,
+	response *ResponseScheme, err error) {
+
+	if len(contentID) == 0 {
+		return nil, nil, notContentIDError
+	}
+
+	if len(key) == 0 {
+		return nil, nil, notPropertyKeyError
+	}
+
+	var endpoint = fmt.Sprintf("/wiki/rest/api/content/%v/property/%v", contentID, key)
+
+	request, err := c.client.newRequest(ctx, http.MethodGet, endpoint, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	request.Header.Set("Accept", "application/json")
+
+	response, err = c.client.Call(request, &result)
+	if err != nil {
+		return nil, response, err
+	}
+
+	return
+}
+
+// Delete deletes a content property.
+// Atlassian Docs: https://developer.atlassian.com/cloud/confluence/rest/api-group-content-properties/#api-wiki-rest-api-content-id-property-key-delete
+func (c *ContentPropertyService) Delete(ctx context.Context, contentID, key string) (response *ResponseScheme, err error) {
+
+	if len(contentID) == 0 {
+		return nil, notContentIDError
+	}
+
+	if len(key) == 0 {
+		return nil, notPropertyKeyError
+	}
+
+	var endpoint = fmt.Sprintf("/wiki/rest/api/content/%v/property/%v", contentID, key)
+
+	request, err := c.client.newRequest(ctx, http.MethodDelete, endpoint, nil)
+	if err != nil {
+		return nil, err
+	}
+
+	response, err = c.client.Call(request, nil)
+	if err != nil {
+		return response, err
+	}
+
+	return
+}
+
+type ContentPropertyPayloadScheme struct {
+	Key   string `json:"key"`
+	Value string `json:"value"`
+}
+
+type ContentPropertyPageScheme struct {
+	Results []*ContentPropertyScheme `json:"results,omitempty"`
+	Start   int                      `json:"start,omitempty"`
+	Limit   int                      `json:"limit,omitempty"`
+	Size    int                      `json:"size,omitempty"`
+}
+
+type ContentPropertyScheme struct {
+	ID         string                        `json:"id,omitempty"`
+	Key        string                        `json:"key,omitempty"`
+	Value      interface{}                   `json:"value,omitempty"`
+	Version    *ContentPropertyVersionScheme `json:"version,omitempty"`
+	Expandable struct {
+		Content              string `json:"content,omitempty"`
+		AdditionalProperties string `json:"additionalProperties,omitempty"`
+	} `json:"_expandable,omitempty"`
+}
+
+type ContentPropertyVersionScheme struct {
+	When                string `json:"when,omitempty"`
+	Message             string `json:"message,omitempty"`
+	Number              int    `json:"number,omitempty"`
+	MinorEdit           bool   `json:"minorEdit,omitempty"`
+	ContentTypeModified bool   `json:"contentTypeModified,omitempty"`
+}
+
+var (
+	notPropertyKeyError = fmt.Errorf("error!, please provide a valid property key")
+)
diff --git a/confluence/examples/contentLabels/add/add.go b/confluence/examples/contentLabels/add/add.go
new file mode 100644
index 0000000..cfdbce8
--- /dev/null
+++ b/confluence/examples/contentLabels/add/add.go
@@ -0,0 +1,47 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/confluence"
+	"log"
+	"os"
+)
+
+func main()  {
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := confluence.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+	atlassian.Auth.SetUserAgent("curl/7.54.0")
+
+	var (
+		contentID = "80412692"
+		payload = []*confluence.ContentLabelPayloadScheme{
+			{
+				Prefix: "global",
+				Name:   "label-02",
+			},
+		}
+	)
+
+	labels, response, err := atlassian.Content.Label.Add(context.Background(), contentID, payload, false)
+	if err != nil {
+		log.Println(response.Endpoint)
+		log.Println(response.Bytes.String())
+		log.Fatal(err)
+	}
+
+	for _, label := range labels.Results {
+		log.Println(label)
+	}
+
+}
diff --git a/confluence/examples/contentLabels/gets/gets.go b/confluence/examples/contentLabels/gets/gets.go
new file mode 100644
index 0000000..36bafc9
--- /dev/null
+++ b/confluence/examples/contentLabels/gets/gets.go
@@ -0,0 +1,44 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/confluence"
+	"log"
+	"os"
+)
+
+func main()  {
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := confluence.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+	atlassian.Auth.SetUserAgent("curl/7.54.0")
+
+	var (
+		contentID = "80412692"
+		prefix = ""
+		startAt = 0
+		maxResults = 50
+	)
+
+	labels, response, err := atlassian.Content.Label.Gets(context.Background(), contentID, prefix, startAt, maxResults)
+	if err != nil {
+		log.Println(response.Endpoint)
+		log.Println(response.Bytes.String())
+		log.Fatal(err)
+	}
+
+
+	for _, label := range labels.Results {
+		log.Println(label)
+	}
+}
diff --git a/confluence/examples/contentLabels/remove/remove.go b/confluence/examples/contentLabels/remove/remove.go
new file mode 100644
index 0000000..95061a8
--- /dev/null
+++ b/confluence/examples/contentLabels/remove/remove.go
@@ -0,0 +1,34 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/confluence"
+	"log"
+	"os"
+)
+
+func main()  {
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := confluence.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+	atlassian.Auth.SetUserAgent("curl/7.54.0")
+
+
+	response, err := atlassian.Content.Label.Remove(context.Background(), "80412692", "label-02")
+	if err != nil {
+		log.Println(response.Endpoint)
+		log.Println(response.Bytes.String())
+		log.Fatal(err)
+	}
+
+}
\ No newline at end of file
diff --git a/confluence/examples/contentProperties/create/create.go b/confluence/examples/contentProperties/create/create.go
new file mode 100644
index 0000000..b653d8d
--- /dev/null
+++ b/confluence/examples/contentProperties/create/create.go
@@ -0,0 +1,47 @@
+package main
+
+import (
+	"context"
+	"fmt"
+	"github.com/ctreminiom/go-atlassian/confluence"
+	"log"
+	"net/http"
+	"os"
+)
+
+func main() {
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	instance, err := confluence.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	instance.Auth.SetBasicAuth(mail, token)
+	instance.Auth.SetUserAgent("curl/7.54.0")
+
+	var payload = &confluence.ContentPropertyPayloadScheme{
+		Key:   "key",
+		Value: "value",
+	}
+
+	property, response, err := instance.Content.Property.Create(context.Background(), "80412692", payload)
+	if err != nil {
+		if response != nil {
+			if response.Code == http.StatusBadRequest {
+				log.Println(response.API)
+			}
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Endpoint:", response.Endpoint)
+	log.Println("Status Code:", response.Code)
+	fmt.Println(property)
+
+}
diff --git a/confluence/examples/contentProperties/delete/delete.go b/confluence/examples/contentProperties/delete/delete.go
new file mode 100644
index 0000000..f797373
--- /dev/null
+++ b/confluence/examples/contentProperties/delete/delete.go
@@ -0,0 +1,39 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/confluence"
+	"log"
+	"net/http"
+	"os"
+)
+
+func main() {
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	instance, err := confluence.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	instance.Auth.SetBasicAuth(mail, token)
+	instance.Auth.SetUserAgent("curl/7.54.0")
+
+	response, err := instance.Content.Property.Delete(context.Background(), "80412692", "key")
+	if err != nil {
+		if response != nil {
+			if response.Code == http.StatusBadRequest {
+				log.Println(response.API)
+			}
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Endpoint:", response.Endpoint)
+	log.Println("Status Code:", response.Code)
+}
diff --git a/confluence/examples/contentProperties/get/get.go b/confluence/examples/contentProperties/get/get.go
new file mode 100644
index 0000000..cf7af60
--- /dev/null
+++ b/confluence/examples/contentProperties/get/get.go
@@ -0,0 +1,41 @@
+package main
+
+import (
+	"context"
+	"fmt"
+	"github.com/ctreminiom/go-atlassian/confluence"
+	"log"
+	"net/http"
+	"os"
+)
+
+func main() {
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	instance, err := confluence.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	instance.Auth.SetBasicAuth(mail, token)
+	instance.Auth.SetUserAgent("curl/7.54.0")
+
+	property, response, err := instance.Content.Property.Get(context.Background(), "80412692", "editor")
+	if err != nil {
+		if response != nil {
+			if response.Code == http.StatusBadRequest {
+				log.Println(response.API)
+			}
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Endpoint:", response.Endpoint)
+	log.Println("Status Code:", response.Code)
+	fmt.Println(property)
+}
diff --git a/confluence/examples/contentProperties/gets/gets.go b/confluence/examples/contentProperties/gets/gets.go
new file mode 100644
index 0000000..f7cc1e8
--- /dev/null
+++ b/confluence/examples/contentProperties/gets/gets.go
@@ -0,0 +1,51 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/confluence"
+	"log"
+	"net/http"
+	"os"
+)
+
+func main() {
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	instance, err := confluence.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	instance.Auth.SetBasicAuth(mail, token)
+	instance.Auth.SetUserAgent("curl/7.54.0")
+
+	var (
+		contentID  = "80412692"
+		expand     = []string{"version"}
+		startAt    = 0
+		maxResults = 50
+	)
+
+	properties, response, err := instance.Content.Property.Gets(context.Background(), contentID, expand, startAt, maxResults)
+	if err != nil {
+		if response != nil {
+			if response.Code == http.StatusBadRequest {
+				log.Println(response.API)
+			}
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Endpoint:", response.Endpoint)
+	log.Println("Status Code:", response.Code)
+
+	for _, property := range properties.Results {
+		log.Println(property)
+	}
+
+}
diff --git a/confluence/mocks/get-content-labels.json b/confluence/mocks/get-content-labels.json
new file mode 100644
index 0000000..d703bc8
--- /dev/null
+++ b/confluence/mocks/get-content-labels.json
@@ -0,0 +1,14 @@
+{
+  "results": [
+    {
+      "prefix": "<string>",
+      "name": "<string>",
+      "id": "<string>",
+      "label": "<string>"
+    }
+  ],
+  "start": 2154,
+  "limit": 2154,
+  "size": 2154,
+  "_links": {}
+}
\ No newline at end of file
diff --git a/confluence/mocks/get-content-properties.json b/confluence/mocks/get-content-properties.json
new file mode 100644
index 0000000..971fa63
--- /dev/null
+++ b/confluence/mocks/get-content-properties.json
@@ -0,0 +1,25 @@
+{
+  "results": [
+    {
+      "id": "<string>",
+      "key": "<string>",
+      "value": "<string>",
+      "version": {
+        "when": "<string>",
+        "message": "<string>",
+        "number": 2154,
+        "minorEdit": true,
+        "contentTypeModified": true
+      },
+      "_links": {},
+      "_expandable": {
+        "content": "<string>",
+        "additionalProperties": "<string>"
+      }
+    }
+  ],
+  "start": 2154,
+  "limit": 2154,
+  "size": 2154,
+  "_links": {}
+}
\ No newline at end of file
diff --git a/confluence/mocks/get-content-property.json b/confluence/mocks/get-content-property.json
new file mode 100644
index 0000000..eeed7c8
--- /dev/null
+++ b/confluence/mocks/get-content-property.json
@@ -0,0 +1,17 @@
+{
+  "id": "<string>",
+  "key": "<string>",
+  "value": "<string>",
+  "version": {
+    "when": "<string>",
+    "message": "<string>",
+    "number": 2154,
+    "minorEdit": true,
+    "contentTypeModified": true
+  },
+  "_links": {},
+  "_expandable": {
+    "content": "<string>",
+    "additionalProperties": "<string>"
+  }
+}
\ No newline at end of file
diff --git a/jira/examples/issue-type-screen-schemes/schemesByProject/schemesByProject.go b/jira/examples/issue-type-screen-schemes/schemesByProject/schemesByProject.go
new file mode 100644
index 0000000..18ef66a
--- /dev/null
+++ b/jira/examples/issue-type-screen-schemes/schemesByProject/schemesByProject.go
@@ -0,0 +1,46 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	schemesByProject, response, err := atlassian.Issue.Type.ScreenScheme.SchemesByProject(context.Background(), 10181, 0, 50)
+	if err != nil {
+		log.Println(response)
+		log.Fatal(err)
+	}
+
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+	log.Println(schemesByProject.Total)
+
+	for _, value := range schemesByProject.Values {
+		log.Println(value)
+	}
+}
diff --git a/jira/examples/project-category/create/create.go b/jira/examples/project-category/create/create.go
new file mode 100644
index 0000000..a2989a3
--- /dev/null
+++ b/jira/examples/project-category/create/create.go
@@ -0,0 +1,53 @@
+package main
+
+import (
+	"context"
+	"fmt"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"math/rand"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	var payload = &jira.ProjectCategoryPayloadScheme{
+		Name:        fmt.Sprintf("Category #%v", rand.Intn(100)),
+		Description: "description sample",
+	}
+
+	newCategory, response, err := atlassian.Project.Category.Create(context.Background(), payload)
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+
+	log.Printf("The new category %v has been created with the ID %v", newCategory.Name, newCategory.ID)
+}
diff --git a/jira/examples/project-category/delete/delete.go b/jira/examples/project-category/delete/delete.go
new file mode 100644
index 0000000..e84aa45
--- /dev/null
+++ b/jira/examples/project-category/delete/delete.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	response, err := atlassian.Project.Category.Delete(context.Background(), 10002)
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+	log.Println("HTTP Endpoint Bytes", response.Bytes.String())
+}
diff --git a/jira/examples/project-category/get/get.go b/jira/examples/project-category/get/get.go
new file mode 100644
index 0000000..04c6daa
--- /dev/null
+++ b/jira/examples/project-category/get/get.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	category, response, err := atlassian.Project.Category.Get(context.Background(), 10002)
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+	log.Println(category)
+}
diff --git a/jira/examples/project-category/gets/gets.go b/jira/examples/project-category/gets/gets.go
new file mode 100644
index 0000000..d912102
--- /dev/null
+++ b/jira/examples/project-category/gets/gets.go
@@ -0,0 +1,46 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	categories, response, err := atlassian.Project.Category.Gets(context.Background())
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+
+	for _, category := range categories {
+
+		log.Println("----------------")
+		log.Println(category.Self)
+		log.Println(category.ID)
+		log.Println(category.Name)
+		log.Println(category.Description)
+		log.Println("----------------")
+	}
+
+}
diff --git a/jira/examples/project-category/update/update.go b/jira/examples/project-category/update/update.go
new file mode 100644
index 0000000..753d54a
--- /dev/null
+++ b/jira/examples/project-category/update/update.go
@@ -0,0 +1,54 @@
+package main
+
+import (
+	"context"
+	"fmt"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"math/rand"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	var (
+		projectCategoryID = 10000
+		payload           = &jira.ProjectCategoryPayloadScheme{
+			Name: fmt.Sprintf("Category #%v - updated", rand.Intn(100)),
+		}
+	)
+
+	categoryUpdated, response, err := atlassian.Project.Category.Update(context.Background(), projectCategoryID, payload)
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+	log.Printf("The project category %v has been updated", categoryUpdated.ID)
+}
diff --git a/jira/examples/project-role-actor/add/add.go b/jira/examples/project-role-actor/add/add.go
new file mode 100644
index 0000000..20a67b6
--- /dev/null
+++ b/jira/examples/project-role-actor/add/add.go
@@ -0,0 +1,57 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	var (
+		projectKeyOrID = "KP"
+		projectRoleID  = 10005
+		accountIDs     = []string{"5b86be50b8e3cb5895860d6d"}
+		groupsNames    = []string{"scrum-masters"}
+	)
+
+	role, response, err := atlassian.Project.Role.Actor.Add(context.Background(),
+		projectKeyOrID, projectRoleID, accountIDs, groupsNames)
+
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+
+	for _, actor := range role.Actors {
+		log.Println(actor)
+	}
+}
diff --git a/jira/examples/project-role-actor/delete/delete.go b/jira/examples/project-role-actor/delete/delete.go
new file mode 100644
index 0000000..2c479b4
--- /dev/null
+++ b/jira/examples/project-role-actor/delete/delete.go
@@ -0,0 +1,57 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	var (
+		projectKeyOrID = "KP"
+		projectRoleID  = 10005
+		accountID      = "5b86be50b8e3cb5895860d6d"
+		groupName      = "scrum-masters"
+	)
+
+	response, err := atlassian.Project.Role.Actor.Delete(context.Background(),
+		projectKeyOrID,
+		projectRoleID,
+		accountID,
+		groupName,
+	)
+
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+}
diff --git a/jira/examples/project-type/accesible/accesible.go b/jira/examples/project-type/accesible/accesible.go
new file mode 100644
index 0000000..74878f3
--- /dev/null
+++ b/jira/examples/project-type/accesible/accesible.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	projectType, response, err := atlassian.Project.Type.Accessible(context.Background(), "software")
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+	log.Println(projectType)
+}
diff --git a/jira/examples/project-type/get/get.go b/jira/examples/project-type/get/get.go
new file mode 100644
index 0000000..14dadaf
--- /dev/null
+++ b/jira/examples/project-type/get/get.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	projectType, response, err := atlassian.Project.Type.Get(context.Background(), "software")
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+	log.Println(projectType)
+}
diff --git a/jira/examples/project-type/gets/gets.go b/jira/examples/project-type/gets/gets.go
new file mode 100644
index 0000000..f080443
--- /dev/null
+++ b/jira/examples/project-type/gets/gets.go
@@ -0,0 +1,49 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	projectTypes, response, err := atlassian.Project.Type.Gets(context.Background())
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+	log.Println("Response Buffer", response.Bytes.String())
+
+	for _, projectType := range projectTypes {
+		log.Println(projectType)
+	}
+}
diff --git a/jira/examples/project-type/licensed/licensed.go b/jira/examples/project-type/licensed/licensed.go
new file mode 100644
index 0000000..746e3a6
--- /dev/null
+++ b/jira/examples/project-type/licensed/licensed.go
@@ -0,0 +1,48 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	projectTypes, response, err := atlassian.Project.Type.Licensed(context.Background())
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+
+	for _, projectType := range projectTypes {
+		log.Println(projectType.Key)
+	}
+}
diff --git a/jira/examples/project-version/create/create.go b/jira/examples/project-version/create/create.go
new file mode 100644
index 0000000..8f71b3a
--- /dev/null
+++ b/jira/examples/project-version/create/create.go
@@ -0,0 +1,55 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	payload := &jira.ProjectVersionPayloadScheme{
+		Archived:    false,
+		ReleaseDate: "2021-03-06",
+		Name:        "Version Sandbox",
+		Description: "Version Sandbox description",
+		ProjectID:   10000,
+		Released:    false,
+		StartDate:   "2021-03-02",
+	}
+
+	newVersion, response, err := atlassian.Project.Version.Create(context.Background(), payload)
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+	log.Printf("The new version has been created with the ID %v", newVersion.ID)
+}
diff --git a/jira/examples/project-version/get/get.go b/jira/examples/project-version/get/get.go
new file mode 100644
index 0000000..36bfa06
--- /dev/null
+++ b/jira/examples/project-version/get/get.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	version, response, err := atlassian.Project.Version.Get(context.Background(), "10002", []string{"issuesstatus", "operations"})
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+	log.Println(version)
+}
diff --git a/jira/examples/project-version/gets/gets.go b/jira/examples/project-version/gets/gets.go
new file mode 100644
index 0000000..9a63736
--- /dev/null
+++ b/jira/examples/project-version/gets/gets.go
@@ -0,0 +1,55 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	options := &jira.ProjectVersionGetsOptions{
+		OrderBy: "description",
+		Query:   "",
+		Status:  "unreleased",
+		Expand:  []string{"issuesstatus", "operations"},
+	}
+
+	versions, response, err := atlassian.Project.Version.Gets(context.Background(), "KP", options, 0, 50)
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+
+	for _, version := range versions.Values {
+		log.Println(version)
+	}
+}
diff --git a/jira/examples/project-version/merge/merge.go b/jira/examples/project-version/merge/merge.go
new file mode 100644
index 0000000..8eccc16
--- /dev/null
+++ b/jira/examples/project-version/merge/merge.go
@@ -0,0 +1,44 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	response, err := atlassian.Project.Version.Merge(context.Background(), "10001", "10000")
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+}
diff --git a/jira/examples/project-version/relatedIssueCounts/relatedIssueCounts.go b/jira/examples/project-version/relatedIssueCounts/relatedIssueCounts.go
new file mode 100644
index 0000000..ca08d00
--- /dev/null
+++ b/jira/examples/project-version/relatedIssueCounts/relatedIssueCounts.go
@@ -0,0 +1,42 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	count, response, err := atlassian.Project.Version.RelatedIssueCounts(context.Background(), "10002")
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	log.Println(response.Endpoint)
+	log.Println(count)
+
+}
diff --git a/jira/examples/project-version/unresolvedIssueCount/unresolvedIssueCount.go b/jira/examples/project-version/unresolvedIssueCount/unresolvedIssueCount.go
new file mode 100644
index 0000000..b9caa53
--- /dev/null
+++ b/jira/examples/project-version/unresolvedIssueCount/unresolvedIssueCount.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	count, response, err := atlassian.Project.Version.UnresolvedIssueCount(context.Background(), "10000")
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+	log.Println(count)
+}
diff --git a/jira/examples/project-version/update/update.go b/jira/examples/project-version/update/update.go
new file mode 100644
index 0000000..ba13cb6
--- /dev/null
+++ b/jira/examples/project-version/update/update.go
@@ -0,0 +1,53 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/jira"
+	"log"
+	"os"
+)
+
+func main() {
+
+	/*
+		----------- Set an environment variable in git bash -----------
+		export HOST="https://ctreminiom.atlassian.net/"
+		export MAIL="MAIL_ADDRESS"
+		export TOKEN="TOKEN_API"
+
+		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
+	*/
+
+	var (
+		host  = os.Getenv("HOST")
+		mail  = os.Getenv("MAIL")
+		token = os.Getenv("TOKEN")
+	)
+
+	atlassian, err := jira.New(nil, host)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	atlassian.Auth.SetBasicAuth(mail, token)
+
+	payload := &jira.ProjectVersionPayloadScheme{
+		Archived:    false,
+		Name:        "Version Sandbox - UPDATED",
+		Description: "Version Sandbox description - UPDATED",
+		ProjectID:   10000,
+		Released:    true,
+	}
+
+	versionUpdated, response, err := atlassian.Project.Version.Update(context.Background(), "10002", payload)
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", response.Bytes.String())
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.Code)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+	log.Println(versionUpdated)
+}
diff --git a/jira/issueTypeScreenScheme.go b/jira/issueTypeScreenScheme.go
index 3d55b37..d74ed8b 100644
--- a/jira/issueTypeScreenScheme.go
+++ b/jira/issueTypeScreenScheme.go
@@ -281,7 +281,8 @@ func (i *IssueTypeScreenSchemeService) Update(ctx context.Context, issueTypeScre
 // Delete deletes an issue type screen scheme.
 // Docs: https://docs.go-atlassian.io/jira-software-cloud/issues/types/screen-scheme#delete-issue-type-screen-scheme
 // Atlassian Docs: https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-type-screen-schemes/#api-rest-api-3-issuetypescreenscheme-issuetypescreenschemeid-delete
-func (i *IssueTypeScreenSchemeService) Delete(ctx context.Context, issueTypeScreenSchemeID string) (response *ResponseScheme, err error) {
+func (i *IssueTypeScreenSchemeService) Delete(ctx context.Context, issueTypeScreenSchemeID string) (response *ResponseScheme,
+	err error) {
 
 	if len(issueTypeScreenSchemeID) == 0 {
 		return nil, notIssueTypeScreenSchemeIDError
@@ -379,8 +380,9 @@ func (i *IssueTypeScreenSchemeService) UpdateDefault(ctx context.Context, issueT
 
 // Remove removes issue type to screen scheme mappings from an issue type screen scheme.
 // Docs: https://docs.go-atlassian.io/jira-software-cloud/issues/types/screen-scheme#remove-mappings-from-issue-type-screen-scheme
-// Atlassina Docs: https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-type-screen-schemes/#api-rest-api-3-issuetypescreenscheme-issuetypescreenschemeid-mapping-remove-post
-func (i *IssueTypeScreenSchemeService) Remove(ctx context.Context, issueTypeScreenSchemeID string, issueTypeIDs []string) (response *ResponseScheme, err error) {
+// Atlassian Docs: https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-type-screen-schemes/#api-rest-api-3-issuetypescreenscheme-issuetypescreenschemeid-mapping-remove-post
+func (i *IssueTypeScreenSchemeService) Remove(ctx context.Context, issueTypeScreenSchemeID string, issueTypeIDs []string) (
+	response *ResponseScheme, err error) {
 
 	if len(issueTypeScreenSchemeID) == 0 {
 		return nil, notIssueTypeScreenSchemeIDError
@@ -415,6 +417,52 @@ func (i *IssueTypeScreenSchemeService) Remove(ctx context.Context, issueTypeScre
 	return
 }
 
+// SchemesByProject returns a paginated list of projects associated with an issue type screen scheme.
+// Docs: N/A
+// Atlassian Docs: https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-type-screen-schemes/#api-rest-api-3-issuetypescreenscheme-issuetypescreenschemeid-project-get
+// NOTE: Experimental Method
+func (i *IssueTypeScreenSchemeService) SchemesByProject(ctx context.Context, issueTypeScreenSchemeID int, startAt,
+	maxResults int) (result *IssueTypeScreenSchemeByProjectPageScheme, response *ResponseScheme, err error) {
+
+	params := url.Values{}
+	params.Add("startAt", strconv.Itoa(startAt))
+	params.Add("maxResults", strconv.Itoa(maxResults))
+
+	var endpoint = fmt.Sprintf("rest/api/3/issuetypescreenscheme/%v/project?%v", issueTypeScreenSchemeID, params.Encode())
+
+	request, err := i.client.newRequest(ctx, http.MethodGet, endpoint, nil)
+	if err != nil {
+		return
+	}
+
+	request.Header.Set("Accept", "application/json")
+
+	response, err = i.client.call(request, &result)
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+type IssueTypeScreenSchemeByProjectPageScheme struct {
+	MaxResults int                    `json:"maxResults,omitempty"`
+	StartAt    int                    `json:"startAt,omitempty"`
+	Total      int                    `json:"total,omitempty"`
+	IsLast     bool                   `json:"isLast,omitempty"`
+	Values     []*ProjectDetailScheme `json:"values,omitempty"`
+}
+
+type ProjectDetailScheme struct {
+	Self            string                 `json:"self,omitempty"`
+	ID              string                 `json:"id,omitempty"`
+	Key             string                 `json:"key,omitempty"`
+	Name            string                 `json:"name,omitempty"`
+	ProjectTypeKey  string                 `json:"projectTypeKey,omitempty"`
+	Simplified      bool                   `json:"simplified,omitempty"`
+	ProjectCategory *ProjectCategoryScheme `json:"projectCategory,omitempty"`
+}
+
 var (
 	notIssueTypeScreenSchemeIDError = fmt.Errorf("error, please provide a issueTypeScreenSchemeID value")
 	notScreenSchemeIDError          = fmt.Errorf("error, please provide a screenSchemeID value")
diff --git a/jira/mocks/get-issue-type-screen-schemes-by-project.json b/jira/mocks/get-issue-type-screen-schemes-by-project.json
new file mode 100644
index 0000000..8bfe0cc
--- /dev/null
+++ b/jira/mocks/get-issue-type-screen-schemes-by-project.json
@@ -0,0 +1,30 @@
+{
+  "self": "<string>",
+  "nextPage": "<string>",
+  "maxResults": 51,
+  "startAt": 37,
+  "total": 29,
+  "isLast": true,
+  "values": [
+    {
+      "self": "<string>",
+      "id": "<string>",
+      "key": "<string>",
+      "name": "<string>",
+      "projectTypeKey": "software",
+      "simplified": true,
+      "avatarUrls": {
+        "16x16": "<string>",
+        "24x24": "<string>",
+        "32x32": "<string>",
+        "48x48": "<string>"
+      },
+      "projectCategory": {
+        "self": "<string>",
+        "id": "<string>",
+        "description": "<string>",
+        "name": "<string>"
+      }
+    }
+  ]
+}
\ No newline at end of file


Test patch:
diff --git a/confluence/contentLabels_test.go b/confluence/contentLabels_test.go
new file mode 100644
index 0000000..e75ee34
--- /dev/null
+++ b/confluence/contentLabels_test.go
@@ -0,0 +1,504 @@
+package confluence
+
+import (
+	"context"
+	"fmt"
+	"github.com/stretchr/testify/assert"
+	"net/http"
+	"net/url"
+	"testing"
+)
+
+func TestContentLabelService_Add(t *testing.T) {
+
+	testCases := []struct {
+		name               string
+		contentID          string
+		payload            []*ContentLabelPayloadScheme
+		want400Response    bool
+		mockFile           string
+		wantHTTPMethod     string
+		endpoint           string
+		context            context.Context
+		wantHTTPCodeReturn int
+		wantErr            bool
+	}{
+		{
+			name:      "AddContentLabelWhenTheParametersAreCorrect",
+			contentID: "48483737372",
+			payload: []*ContentLabelPayloadScheme{
+				{
+					Prefix: "global",
+					Name:   "label-02",
+				},
+			},
+			want400Response:    true,
+			mockFile:           "./mocks/get-content-labels.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/wiki/rest/api/content/48483737372/label?use-400-error-response=true",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusCreated,
+			wantErr:            false,
+		},
+
+		{
+			name:      "AddContentLabelWhenTheContentIDIsNotProvided",
+			contentID: "",
+			payload: []*ContentLabelPayloadScheme{
+				{
+					Prefix: "global",
+					Name:   "label-02",
+				},
+			},
+			want400Response:    true,
+			mockFile:           "./mocks/get-content-labels.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/wiki/rest/api/content/48483737372/label?use-400-error-response=true",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusCreated,
+			wantErr:            true,
+		},
+
+		{
+			name:      "AddContentLabelWhenTheContextIsNotProvided",
+			contentID: "48483737372",
+			payload: []*ContentLabelPayloadScheme{
+				{
+					Prefix: "global",
+					Name:   "label-02",
+				},
+			},
+			want400Response:    true,
+			mockFile:           "./mocks/get-content-labels.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/wiki/rest/api/content/48483737372/label?use-400-error-response=true",
+			context:            nil,
+			wantHTTPCodeReturn: http.StatusCreated,
+			wantErr:            true,
+		},
+
+		{
+			name:               "AddContentLabelWhenThePayloadIsNotProvided",
+			contentID:          "48483737372",
+			payload:            nil,
+			want400Response:    true,
+			mockFile:           "./mocks/get-content-labels.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/wiki/rest/api/content/48483737372/label?use-400-error-response=true",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusCreated,
+			wantErr:            true,
+		},
+
+		{
+			name:      "AddContentLabelWhenTheStatusCodeIsIncorrect",
+			contentID: "48483737372",
+			payload: []*ContentLabelPayloadScheme{
+				{
+					Prefix: "global",
+					Name:   "label-02",
+				},
+			},
+			want400Response:    true,
+			mockFile:           "./mocks/get-content-labels.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/wiki/rest/api/content/48483737372/label?use-400-error-response=true",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusBadRequest,
+			wantErr:            true,
+		},
+
+		{
+			name:      "AddContentLabelWhenTheResponseBodyIsEmpty",
+			contentID: "48483737372",
+			payload: []*ContentLabelPayloadScheme{
+				{
+					Prefix: "global",
+					Name:   "label-02",
+				},
+			},
+			want400Response:    true,
+			mockFile:           "./mocks/empty-json.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/wiki/rest/api/content/48483737372/label?use-400-error-response=true",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusCreated,
+			wantErr:            true,
+		},
+	}
+
+	for _, testCase := range testCases {
+
+		testCase := testCase
+
+		t.Run(testCase.name, func(t *testing.T) {
+			t.Parallel()
+
+			//Init a new HTTP mock server
+			mockOptions := mockServerOptions{
+				Endpoint:           testCase.endpoint,
+				MockFilePath:       testCase.mockFile,
+				MethodAccepted:     testCase.wantHTTPMethod,
+				ResponseCodeWanted: testCase.wantHTTPCodeReturn,
+			}
+
+			mockServer, err := startMockServer(&mockOptions)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			defer mockServer.Close()
+
+			//Init the library instance
+			mockClient, err := startMockClient(mockServer.URL)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			service := &ContentLabelService{client: mockClient}
+
+			gotResult, gotResponse, err := service.Add(testCase.context, testCase.contentID, testCase.payload, testCase.want400Response)
+
+			if testCase.wantErr {
+
+				if err != nil {
+					t.Logf("error returned: %v", err.Error())
+				}
+
+				assert.Error(t, err)
+			} else {
+
+				assert.NoError(t, err)
+				assert.NotEqual(t, gotResponse, nil)
+				assert.NotEqual(t, gotResult, nil)
+
+				apiEndpoint, err := url.Parse(gotResponse.Endpoint)
+				if err != nil {
+					t.Fatal(err)
+				}
+
+				var endpointToAssert string
+
+				if apiEndpoint.Query().Encode() != "" {
+					endpointToAssert = fmt.Sprintf("%v?%v", apiEndpoint.Path, apiEndpoint.Query().Encode())
+				} else {
+					endpointToAssert = apiEndpoint.Path
+				}
+
+				t.Logf("HTTP Endpoint Wanted: %v, HTTP Endpoint Returned: %v", testCase.endpoint, endpointToAssert)
+				assert.Equal(t, testCase.endpoint, endpointToAssert)
+			}
+		})
+	}
+
+}
+
+func TestContentLabelService_Gets(t *testing.T) {
+
+	testCases := []struct {
+		name                string
+		contentID           string
+		prefix              string
+		startAt, maxResults int
+		mockFile            string
+		wantHTTPMethod      string
+		endpoint            string
+		context             context.Context
+		wantHTTPCodeReturn  int
+		wantErr             bool
+	}{
+		{
+			name:               "GetContentLabelsWhenTheParametersAreCorrect",
+			contentID:          "3483373",
+			prefix:             "global",
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/get-content-labels.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/wiki/rest/api/content/3483373/label?limit=50&prefix=global&start=0",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusOK,
+			wantErr:            false,
+		},
+
+		{
+			name:               "GetContentLabelsWhenTheParametersAreCorrect",
+			contentID:          "3483373",
+			prefix:             "global",
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/get-content-labels.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/wiki/rest/api/content/3483373/label?limit=50&prefix=global&start=0",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusOK,
+			wantErr:            false,
+		},
+
+		{
+			name:               "GetContentLabelsWhenTheContextIsNotProvided",
+			contentID:          "",
+			prefix:             "global",
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/get-content-labels.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/wiki/rest/api/content/3483373/label?limit=50&prefix=global&start=0",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusOK,
+			wantErr:            true,
+		},
+
+		{
+			name:               "GetContentLabelsWhenTheContextIsNotProvided",
+			contentID:          "3483373",
+			prefix:             "global",
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/get-content-labels.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/wiki/rest/api/content/3483373/label?limit=50&prefix=global&start=0",
+			context:            nil,
+			wantHTTPCodeReturn: http.StatusOK,
+			wantErr:            true,
+		},
+
+		{
+			name:               "GetContentLabelsWhenTheStatusCodeIsIncorrect",
+			contentID:          "3483373",
+			prefix:             "global",
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/get-content-labels.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/wiki/rest/api/content/3483373/label?limit=50&prefix=global&start=0",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusBadRequest,
+			wantErr:            true,
+		},
+
+		{
+			name:               "GetContentLabelsWhenTheResponseBodyIsEmpty",
+			contentID:          "3483373",
+			prefix:             "global",
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/empty-json.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/wiki/rest/api/content/3483373/label?limit=50&prefix=global&start=0",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusOK,
+			wantErr:            true,
+		},
+	}
+
+	for _, testCase := range testCases {
+
+		testCase := testCase
+
+		t.Run(testCase.name, func(t *testing.T) {
+			t.Parallel()
+
+			//Init a new HTTP mock server
+			mockOptions := mockServerOptions{
+				Endpoint:           testCase.endpoint,
+				MockFilePath:       testCase.mockFile,
+				MethodAccepted:     testCase.wantHTTPMethod,
+				ResponseCodeWanted: testCase.wantHTTPCodeReturn,
+			}
+
+			mockServer, err := startMockServer(&mockOptions)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			defer mockServer.Close()
+
+			//Init the library instance
+			mockClient, err := startMockClient(mockServer.URL)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			service := &ContentLabelService{client: mockClient}
+
+			gotResult, gotResponse, err := service.Gets(testCase.context, testCase.contentID, testCase.prefix, testCase.startAt, testCase.maxResults)
+
+			if testCase.wantErr {
+
+				if err != nil {
+					t.Logf("error returned: %v", err.Error())
+				}
+
+				assert.Error(t, err)
+			} else {
+
+				assert.NoError(t, err)
+				assert.NotEqual(t, gotResponse, nil)
+				assert.NotEqual(t, gotResult, nil)
+
+				apiEndpoint, err := url.Parse(gotResponse.Endpoint)
+				if err != nil {
+					t.Fatal(err)
+				}
+
+				var endpointToAssert string
+
+				if apiEndpoint.Query().Encode() != "" {
+					endpointToAssert = fmt.Sprintf("%v?%v", apiEndpoint.Path, apiEndpoint.Query().Encode())
+				} else {
+					endpointToAssert = apiEndpoint.Path
+				}
+
+				t.Logf("HTTP Endpoint Wanted: %v, HTTP Endpoint Returned: %v", testCase.endpoint, endpointToAssert)
+				assert.Equal(t, testCase.endpoint, endpointToAssert)
+			}
+		})
+	}
+
+}
+
+func TestContentLabelService_Remove(t *testing.T) {
+
+	testCases := []struct {
+		name               string
+		contentID          string
+		labelName          string
+		mockFile           string
+		wantHTTPMethod     string
+		endpoint           string
+		context            context.Context
+		wantHTTPCodeReturn int
+		wantErr            bool
+	}{
+		{
+			name:               "RemoveContentLabelsWhenTheParametersAreCorrect",
+			contentID:          "3483373",
+			labelName:          "global",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/wiki/rest/api/content/3483373/label/global",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusNoContent,
+			wantErr:            false,
+		},
+
+		{
+			name:               "RemoveContentLabelsWhenTheContextIDIsNotProvided",
+			contentID:          "",
+			labelName:          "global",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/wiki/rest/api/content/3483373/label/global",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusNoContent,
+			wantErr:            true,
+		},
+
+		{
+			name:               "RemoveContentLabelsWhenTheContextIsNotProvided",
+			contentID:          "3483373",
+			labelName:          "global",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/wiki/rest/api/content/3483373/label/global",
+			context:            nil,
+			wantHTTPCodeReturn: http.StatusNoContent,
+			wantErr:            true,
+		},
+
+		{
+			name:               "RemoveContentLabelsWhenTheRequestMethodIsIncorrect",
+			contentID:          "3483373",
+			labelName:          "global",
+			wantHTTPMethod:     http.MethodPut,
+			endpoint:           "/wiki/rest/api/content/3483373/label/global",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusNoContent,
+			wantErr:            true,
+		},
+
+		{
+			name:               "RemoveContentLabelsWhenTheLabelNameIsNotProvided",
+			contentID:          "3483373",
+			labelName:          "",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/wiki/rest/api/content/3483373/label/global",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusNoContent,
+			wantErr:            true,
+		},
+
+		{
+			name:               "RemoveContentLabelsWhenTheStatusCodeIsIncorrect",
+			contentID:          "3483373",
+			labelName:          "global",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/wiki/rest/api/content/3483373/label/global",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusBadRequest,
+			wantErr:            true,
+		},
+	}
+
+	for _, testCase := range testCases {
+
+		testCase := testCase
+
+		t.Run(testCase.name, func(t *testing.T) {
+			t.Parallel()
+
+			//Init a new HTTP mock server
+			mockOptions := mockServerOptions{
+				Endpoint:           testCase.endpoint,
+				MockFilePath:       testCase.mockFile,
+				MethodAccepted:     testCase.wantHTTPMethod,
+				ResponseCodeWanted: testCase.wantHTTPCodeReturn,
+			}
+
+			mockServer, err := startMockServer(&mockOptions)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			defer mockServer.Close()
+
+			//Init the library instance
+			mockClient, err := startMockClient(mockServer.URL)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			service := &ContentLabelService{client: mockClient}
+
+			gotResponse, err := service.Remove(testCase.context, testCase.contentID, testCase.labelName)
+
+			if testCase.wantErr {
+
+				if err != nil {
+					t.Logf("error returned: %v", err.Error())
+				}
+
+				assert.Error(t, err)
+			} else {
+
+				assert.NoError(t, err)
+				assert.NotEqual(t, gotResponse, nil)
+
+				apiEndpoint, err := url.Parse(gotResponse.Endpoint)
+				if err != nil {
+					t.Fatal(err)
+				}
+
+				var endpointToAssert string
+
+				if apiEndpoint.Query().Encode() != "" {
+					endpointToAssert = fmt.Sprintf("%v?%v", apiEndpoint.Path, apiEndpoint.Query().Encode())
+				} else {
+					endpointToAssert = apiEndpoint.Path
+				}
+
+				t.Logf("HTTP Endpoint Wanted: %v, HTTP Endpoint Returned: %v", testCase.endpoint, endpointToAssert)
+				assert.Equal(t, testCase.endpoint, endpointToAssert)
+			}
+		})
+	}
+
+}
diff --git a/confluence/contentProperties_test.go b/confluence/contentProperties_test.go
new file mode 100644
index 0000000..63f6a14
--- /dev/null
+++ b/confluence/contentProperties_test.go
@@ -0,0 +1,623 @@
+package confluence
+
+import (
+	"context"
+	"fmt"
+	"github.com/stretchr/testify/assert"
+	"net/http"
+	"net/url"
+	"testing"
+)
+
+func TestContentPropertyService_Create(t *testing.T) {
+
+	testCases := []struct {
+		name               string
+		contentID          string
+		payload            *ContentPropertyPayloadScheme
+		mockFile           string
+		wantHTTPMethod     string
+		endpoint           string
+		context            context.Context
+		wantHTTPCodeReturn int
+		wantErr            bool
+	}{
+		{
+			name:      "CreateContentPropertyWhenTheParametersAreCorrect",
+			contentID: "9438383838383",
+			payload: &ContentPropertyPayloadScheme{
+				Key:   "key",
+				Value: "value",
+			},
+			mockFile:           "./mocks/get-content-property.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusCreated,
+			wantErr:            false,
+		},
+
+		{
+			name:      "CreateContentPropertyWhenTheContentIDIsNotSet",
+			contentID: "",
+			payload: &ContentPropertyPayloadScheme{
+				Key:   "key",
+				Value: "value",
+			},
+			mockFile:           "./mocks/get-content-property.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusCreated,
+			wantErr:            true,
+		},
+
+		{
+			name:               "CreateContentPropertyWhenThePayloadIsNotSet",
+			contentID:          "9438383838383",
+			payload:            nil,
+			mockFile:           "./mocks/get-content-property.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusCreated,
+			wantErr:            true,
+		},
+
+		{
+			name:      "CreateContentPropertyWhenTheContextIsNotSet",
+			contentID: "9438383838383",
+			payload: &ContentPropertyPayloadScheme{
+				Key:   "key",
+				Value: "value",
+			},
+			mockFile:           "./mocks/get-content-property.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property",
+			context:            nil,
+			wantHTTPCodeReturn: http.StatusCreated,
+			wantErr:            true,
+		},
+
+		{
+			name:      "CreateContentPropertyWhenTheParametersAreCorrect",
+			contentID: "9438383838383",
+			payload: &ContentPropertyPayloadScheme{
+				Key:   "key",
+				Value: "value",
+			},
+			mockFile:           "./mocks/get-content-property.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusCreated,
+			wantErr:            false,
+		},
+
+		{
+			name:      "CreateContentPropertyWhenTheRequestMethodIsIncorrect",
+			contentID: "9438383838383",
+			payload: &ContentPropertyPayloadScheme{
+				Key:   "key",
+				Value: "value",
+			},
+			mockFile:           "./mocks/get-content-property.json",
+			wantHTTPMethod:     http.MethodHead,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusCreated,
+			wantErr:            true,
+		},
+
+		{
+			name:      "CreateContentPropertyWhenTheStatusCodeIsIncorrect",
+			contentID: "9438383838383",
+			payload: &ContentPropertyPayloadScheme{
+				Key:   "key",
+				Value: "value",
+			},
+			mockFile:           "./mocks/get-content-property.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusBadRequest,
+			wantErr:            true,
+		},
+	}
+
+	for _, testCase := range testCases {
+
+		testCase := testCase
+
+		t.Run(testCase.name, func(t *testing.T) {
+			t.Parallel()
+
+			//Init a new HTTP mock server
+			mockOptions := mockServerOptions{
+				Endpoint:           testCase.endpoint,
+				MockFilePath:       testCase.mockFile,
+				MethodAccepted:     testCase.wantHTTPMethod,
+				ResponseCodeWanted: testCase.wantHTTPCodeReturn,
+			}
+
+			mockServer, err := startMockServer(&mockOptions)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			defer mockServer.Close()
+
+			//Init the library instance
+			mockClient, err := startMockClient(mockServer.URL)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			service := &ContentPropertyService{client: mockClient}
+
+			gotResult, gotResponse, err := service.Create(testCase.context, testCase.contentID, testCase.payload)
+
+			if testCase.wantErr {
+
+				if err != nil {
+					t.Logf("error returned: %v", err.Error())
+				}
+
+				assert.Error(t, err)
+			} else {
+
+				assert.NoError(t, err)
+				assert.NotEqual(t, gotResponse, nil)
+				assert.NotEqual(t, gotResult, nil)
+
+				apiEndpoint, err := url.Parse(gotResponse.Endpoint)
+				if err != nil {
+					t.Fatal(err)
+				}
+
+				var endpointToAssert string
+
+				if apiEndpoint.Query().Encode() != "" {
+					endpointToAssert = fmt.Sprintf("%v?%v", apiEndpoint.Path, apiEndpoint.Query().Encode())
+				} else {
+					endpointToAssert = apiEndpoint.Path
+				}
+
+				t.Logf("HTTP Endpoint Wanted: %v, HTTP Endpoint Returned: %v", testCase.endpoint, endpointToAssert)
+				assert.Equal(t, testCase.endpoint, endpointToAssert)
+			}
+		})
+	}
+
+}
+
+func TestContentPropertyService_Gets(t *testing.T) {
+
+	testCases := []struct {
+		name               string
+		contentID, key     string
+		expand             []string
+		startAt            int
+		maxResults         int
+		mockFile           string
+		wantHTTPMethod     string
+		endpoint           string
+		context            context.Context
+		wantHTTPCodeReturn int
+		wantErr            bool
+	}{
+		{
+			name:               "GetContentPropertiesWhenTheParametersAreCorrect",
+			contentID:          "9438383838383",
+			expand:             []string{"expand-00", "expand-01"},
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/get-content-properties.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property?expand=expand-00%2Cexpand-01&limit=50&start=0",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusOK,
+			wantErr:            false,
+		},
+
+		{
+			name:               "GetContentPropertiesWhenTheContentIDIsNotSet",
+			contentID:          "",
+			expand:             []string{"expand-00", "expand-01"},
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/get-content-properties.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property?expand=expand-00%2Cexpand-01&limit=50&start=0",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusOK,
+			wantErr:            true,
+		},
+
+		{
+			name:               "GetContentPropertiesWhenTheContextIsNotSet",
+			contentID:          "9438383838383",
+			expand:             []string{"expand-00", "expand-01"},
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/get-content-properties.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property?expand=expand-00%2Cexpand-01&limit=50&start=0",
+			context:            nil,
+			wantHTTPCodeReturn: http.StatusOK,
+			wantErr:            true,
+		},
+
+		{
+			name:               "GetContentPropertiesWhenTheRequestMethodIsIncorrect",
+			contentID:          "9438383838383",
+			expand:             []string{"expand-00", "expand-01"},
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/get-content-properties.json",
+			wantHTTPMethod:     http.MethodHead,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property?expand=expand-00%2Cexpand-01&limit=50&start=0",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusOK,
+			wantErr:            true,
+		},
+
+		{
+			name:               "GetContentPropertiesWhenTheParametersAreCorrect",
+			contentID:          "9438383838383",
+			expand:             []string{"expand-00", "expand-01"},
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/get-content-properties.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property?expand=expand-00%2Cexpand-01&limit=50&start=0",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusOK,
+			wantErr:            false,
+		},
+	}
+
+	for _, testCase := range testCases {
+
+		testCase := testCase
+
+		t.Run(testCase.name, func(t *testing.T) {
+			t.Parallel()
+
+			//Init a new HTTP mock server
+			mockOptions := mockServerOptions{
+				Endpoint:           testCase.endpoint,
+				MockFilePath:       testCase.mockFile,
+				MethodAccepted:     testCase.wantHTTPMethod,
+				ResponseCodeWanted: testCase.wantHTTPCodeReturn,
+			}
+
+			mockServer, err := startMockServer(&mockOptions)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			defer mockServer.Close()
+
+			//Init the library instance
+			mockClient, err := startMockClient(mockServer.URL)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			service := &ContentPropertyService{client: mockClient}
+
+			gotResult, gotResponse, err := service.Gets(testCase.context, testCase.contentID, testCase.expand, testCase.startAt, testCase.maxResults)
+
+			if testCase.wantErr {
+
+				if err != nil {
+					t.Logf("error returned: %v", err.Error())
+				}
+
+				assert.Error(t, err)
+			} else {
+
+				assert.NoError(t, err)
+				assert.NotEqual(t, gotResponse, nil)
+				assert.NotEqual(t, gotResult, nil)
+
+				apiEndpoint, err := url.Parse(gotResponse.Endpoint)
+				if err != nil {
+					t.Fatal(err)
+				}
+
+				var endpointToAssert string
+
+				if apiEndpoint.Query().Encode() != "" {
+					endpointToAssert = fmt.Sprintf("%v?%v", apiEndpoint.Path, apiEndpoint.Query().Encode())
+				} else {
+					endpointToAssert = apiEndpoint.Path
+				}
+
+				t.Logf("HTTP Endpoint Wanted: %v, HTTP Endpoint Returned: %v", testCase.endpoint, endpointToAssert)
+				assert.Equal(t, testCase.endpoint, endpointToAssert)
+			}
+		})
+	}
+
+}
+
+func TestContentPropertyService_Delete(t *testing.T) {
+	testCases := []struct {
+		name               string
+		contentID, key     string
+		mockFile           string
+		wantHTTPMethod     string
+		endpoint           string
+		context            context.Context
+		wantHTTPCodeReturn int
+		wantErr            bool
+	}{
+		{
+			name:               "RemoveContentPropertyWhenTheParametersAreCorrect",
+			contentID:          "9438383838383",
+			key:                "editor",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property/editor",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusNoContent,
+			wantErr:            false,
+		},
+
+		{
+			name:               "RemoveContentPropertyWhenTheContentIDIsNotSet",
+			contentID:          "",
+			key:                "editor",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property/editor",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusNoContent,
+			wantErr:            true,
+		},
+		{
+			name:               "RemoveContentPropertyWhenTheKeyIsNotSet",
+			contentID:          "9438383838383",
+			key:                "",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property/editor",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusNoContent,
+			wantErr:            true,
+		},
+
+		{
+			name:               "RemoveContentPropertyWhenTheContextIsNotSet",
+			contentID:          "9438383838383",
+			key:                "editor",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property/editor",
+			context:            nil,
+			wantHTTPCodeReturn: http.StatusNoContent,
+			wantErr:            true,
+		},
+
+		{
+			name:               "RemoveContentPropertyWhenTheRequestMethodIsIncorrect",
+			contentID:          "9438383838383",
+			key:                "editor",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property/editor",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusNoContent,
+			wantErr:            true,
+		},
+	}
+
+	for _, testCase := range testCases {
+
+		testCase := testCase
+
+		t.Run(testCase.name, func(t *testing.T) {
+			t.Parallel()
+
+			//Init a new HTTP mock server
+			mockOptions := mockServerOptions{
+				Endpoint:           testCase.endpoint,
+				MockFilePath:       testCase.mockFile,
+				MethodAccepted:     testCase.wantHTTPMethod,
+				ResponseCodeWanted: testCase.wantHTTPCodeReturn,
+			}
+
+			mockServer, err := startMockServer(&mockOptions)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			defer mockServer.Close()
+
+			//Init the library instance
+			mockClient, err := startMockClient(mockServer.URL)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			service := &ContentPropertyService{client: mockClient}
+
+			gotResponse, err := service.Delete(testCase.context, testCase.contentID, testCase.key)
+
+			if testCase.wantErr {
+
+				if err != nil {
+					t.Logf("error returned: %v", err.Error())
+				}
+
+				assert.Error(t, err)
+			} else {
+
+				assert.NoError(t, err)
+				assert.NotEqual(t, gotResponse, nil)
+
+				apiEndpoint, err := url.Parse(gotResponse.Endpoint)
+				if err != nil {
+					t.Fatal(err)
+				}
+
+				var endpointToAssert string
+
+				if apiEndpoint.Query().Encode() != "" {
+					endpointToAssert = fmt.Sprintf("%v?%v", apiEndpoint.Path, apiEndpoint.Query().Encode())
+				} else {
+					endpointToAssert = apiEndpoint.Path
+				}
+
+				t.Logf("HTTP Endpoint Wanted: %v, HTTP Endpoint Returned: %v", testCase.endpoint, endpointToAssert)
+				assert.Equal(t, testCase.endpoint, endpointToAssert)
+			}
+		})
+	}
+}
+
+func TestContentPropertyService_Get(t *testing.T) {
+	testCases := []struct {
+		name               string
+		contentID, key     string
+		mockFile           string
+		wantHTTPMethod     string
+		endpoint           string
+		context            context.Context
+		wantHTTPCodeReturn int
+		wantErr            bool
+	}{
+		{
+			name:               "GetContentPropertyWhenTheParametersAreCorrect",
+			contentID:          "9438383838383",
+			key:                "editor",
+			mockFile:           "./mocks/get-content-property.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property/editor",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusOK,
+			wantErr:            false,
+		},
+
+		{
+			name:               "GetContentPropertyWhenTheContentIDIsNotSet",
+			contentID:          "",
+			key:                "editor",
+			mockFile:           "./mocks/get-content-property.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property/editor",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusOK,
+			wantErr:            true,
+		},
+
+		{
+			name:               "GetContentPropertyWhenTheKeyIsNotSet",
+			contentID:          "9438383838383",
+			key:                "",
+			mockFile:           "./mocks/get-content-property.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property/editor",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusOK,
+			wantErr:            true,
+		},
+
+		{
+			name:               "GetContentPropertyWhenTheContextIsNotSet",
+			contentID:          "9438383838383",
+			key:                "editor",
+			mockFile:           "./mocks/get-content-property.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property/editor",
+			context:            nil,
+			wantHTTPCodeReturn: http.StatusOK,
+			wantErr:            true,
+		},
+
+		{
+			name:               "GetContentPropertyWhenTheRequestMethodIsIncorrect",
+			contentID:          "9438383838383",
+			key:                "editor",
+			mockFile:           "./mocks/get-content-property.json",
+			wantHTTPMethod:     http.MethodHead,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property/editor",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusOK,
+			wantErr:            true,
+		},
+
+		{
+			name:               "GetContentPropertyWhenTheStatusCodeIsIncorrect",
+			contentID:          "9438383838383",
+			key:                "editor",
+			mockFile:           "./mocks/get-content-property.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/wiki/rest/api/content/9438383838383/property/editor",
+			context:            context.Background(),
+			wantHTTPCodeReturn: http.StatusBadRequest,
+			wantErr:            true,
+		},
+	}
+
+	for _, testCase := range testCases {
+
+		testCase := testCase
+
+		t.Run(testCase.name, func(t *testing.T) {
+			t.Parallel()
+
+			//Init a new HTTP mock server
+			mockOptions := mockServerOptions{
+				Endpoint:           testCase.endpoint,
+				MockFilePath:       testCase.mockFile,
+				MethodAccepted:     testCase.wantHTTPMethod,
+				ResponseCodeWanted: testCase.wantHTTPCodeReturn,
+			}
+
+			mockServer, err := startMockServer(&mockOptions)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			defer mockServer.Close()
+
+			//Init the library instance
+			mockClient, err := startMockClient(mockServer.URL)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			service := &ContentPropertyService{client: mockClient}
+
+			gotResult, gotResponse, err := service.Get(testCase.context, testCase.contentID, testCase.key)
+
+			if testCase.wantErr {
+
+				if err != nil {
+					t.Logf("error returned: %v", err.Error())
+				}
+
+				assert.Error(t, err)
+			} else {
+
+				assert.NoError(t, err)
+				assert.NotEqual(t, gotResponse, nil)
+				assert.NotEqual(t, gotResult, nil)
+
+				apiEndpoint, err := url.Parse(gotResponse.Endpoint)
+				if err != nil {
+					t.Fatal(err)
+				}
+
+				var endpointToAssert string
+
+				if apiEndpoint.Query().Encode() != "" {
+					endpointToAssert = fmt.Sprintf("%v?%v", apiEndpoint.Path, apiEndpoint.Query().Encode())
+				} else {
+					endpointToAssert = apiEndpoint.Path
+				}
+
+				t.Logf("HTTP Endpoint Wanted: %v, HTTP Endpoint Returned: %v", testCase.endpoint, endpointToAssert)
+				assert.Equal(t, testCase.endpoint, endpointToAssert)
+			}
+		})
+	}
+}
diff --git a/jira/issueTypeScreenScheme_test.go b/jira/issueTypeScreenScheme_test.go
index 18b4a7f..03a0584 100644
--- a/jira/issueTypeScreenScheme_test.go
+++ b/jira/issueTypeScreenScheme_test.go
@@ -1741,3 +1741,134 @@ func TestIssueTypeScreenSchemeService_Projects(t *testing.T) {
 	}
 
 }
+
+func TestIssueTypeScreenSchemeService_SchemesByProject(t *testing.T) {
+
+	testCases := []struct {
+		name                    string
+		issueTypeScreenSchemeID int
+		startAt                 int
+		maxResults              int
+		mockFile                string
+		wantHTTPMethod          string
+		endpoint                string
+		context                 context.Context
+		wantHTTPCodeReturn      int
+		wantErr                 bool
+	}{
+		{
+			name:                    "GetSchemesByProjectWhenTheParametersAreCorrect",
+			issueTypeScreenSchemeID: 1000,
+			startAt:                 0,
+			maxResults:              50,
+			mockFile:                "./mocks/get-issue-type-screen-schemes-by-project.json",
+			wantHTTPMethod:          http.MethodGet,
+			endpoint:                "/rest/api/3/issuetypescreenscheme/1000/project?maxResults=50&startAt=0",
+			context:                 context.Background(),
+			wantHTTPCodeReturn:      http.StatusOK,
+			wantErr:                 false,
+		},
+
+		{
+			name:                    "GetSchemesByProjectWhenTheRequestMethodIsIncorrect",
+			issueTypeScreenSchemeID: 1000,
+			startAt:                 0,
+			maxResults:              50,
+			mockFile:                "./mocks/get-issue-type-screen-schemes-by-project.json",
+			wantHTTPMethod:          http.MethodHead,
+			endpoint:                "/rest/api/3/issuetypescreenscheme/1000/project?maxResults=50&startAt=0",
+			context:                 context.Background(),
+			wantHTTPCodeReturn:      http.StatusOK,
+			wantErr:                 true,
+		},
+
+		{
+			name:                    "GetSchemesByProjectWhenTheStatusCodeIsIncorrect",
+			issueTypeScreenSchemeID: 1000,
+			startAt:                 0,
+			maxResults:              50,
+			mockFile:                "./mocks/get-issue-type-screen-schemes-by-project.json",
+			wantHTTPMethod:          http.MethodGet,
+			endpoint:                "/rest/api/3/issuetypescreenscheme/1000/project?maxResults=50&startAt=0",
+			context:                 context.Background(),
+			wantHTTPCodeReturn:      http.StatusBadRequest,
+			wantErr:                 true,
+		},
+
+		{
+			name:                    "GetSchemesByProjectWhenTheContextIsNotProvided",
+			issueTypeScreenSchemeID: 1000,
+			startAt:                 0,
+			maxResults:              50,
+			mockFile:                "./mocks/get-issue-type-screen-schemes-by-project.json",
+			wantHTTPMethod:          http.MethodGet,
+			endpoint:                "/rest/api/3/issuetypescreenscheme/1000/project?maxResults=50&startAt=0",
+			context:                 nil,
+			wantHTTPCodeReturn:      http.StatusOK,
+			wantErr:                 true,
+		},
+	}
+
+	for _, testCase := range testCases {
+
+		t.Run(testCase.name, func(t *testing.T) {
+
+			//Init a new HTTP mock server
+			mockOptions := mockServerOptions{
+				Endpoint:           testCase.endpoint,
+				MockFilePath:       testCase.mockFile,
+				MethodAccepted:     testCase.wantHTTPMethod,
+				ResponseCodeWanted: testCase.wantHTTPCodeReturn,
+			}
+
+			mockServer, err := startMockServer(&mockOptions)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			defer mockServer.Close()
+
+			//Init the library instance
+			mockClient, err := startMockClient(mockServer.URL)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			i := &IssueTypeScreenSchemeService{client: mockClient}
+
+			gotResult, gotResponse, err := i.SchemesByProject(testCase.context, testCase.issueTypeScreenSchemeID, testCase.startAt, testCase.maxResults)
+
+			if testCase.wantErr {
+
+				if err != nil {
+					t.Logf("error returned: %v", err.Error())
+				}
+
+				assert.Error(t, err)
+			} else {
+
+				assert.NoError(t, err)
+				assert.NotEqual(t, gotResponse, nil)
+				assert.NotEqual(t, gotResult, nil)
+
+				apiEndpoint, err := url.Parse(gotResponse.Endpoint)
+				if err != nil {
+					t.Fatal(err)
+				}
+
+				var endpointToAssert string
+
+				if apiEndpoint.Query().Encode() != "" {
+					endpointToAssert = fmt.Sprintf("%v?%v", apiEndpoint.Path, apiEndpoint.Query().Encode())
+				} else {
+					endpointToAssert = apiEndpoint.Path
+				}
+
+				t.Logf("HTTP Endpoint Wanted: %v, HTTP Endpoint Returned: %v", testCase.endpoint, endpointToAssert)
+				assert.Equal(t, testCase.endpoint, endpointToAssert)
+			}
+		})
+
+	}
+
+}