diff --git a/binding/richclient.go b/binding/richclient.go index 6302ed07..ccca92cb 100644 --- a/binding/richclient.go +++ b/binding/richclient.go @@ -40,6 +40,7 @@ type RichClient struct { TagCategory TagCategory Target Target Task Task + Ticket Ticket Tracker Tracker // A REST client. @@ -112,6 +113,9 @@ func New(baseUrl string) (r *RichClient) { Task: Task{ client: client, }, + Ticket: Ticket{ + client: client, + }, Tracker: Tracker{ client: client, }, diff --git a/binding/ticket.go b/binding/ticket.go new file mode 100644 index 00000000..60c294dd --- /dev/null +++ b/binding/ticket.go @@ -0,0 +1,42 @@ +package binding + +import ( + "github.com/konveyor/tackle2-hub/api" +) + +// +// Ticket API. +type Ticket struct { + client *Client +} + +// +// Create a Ticket. +func (h *Ticket) Create(r *api.Ticket) (err error) { + err = h.client.Post(api.TicketsRoot, &r) + return +} + +// +// Get a Ticket by ID. +func (h *Ticket) Get(id uint) (r *api.Ticket, err error) { + r = &api.Ticket{} + path := Path(api.TicketRoot).Inject(Params{api.ID: id}) + err = h.client.Get(path, r) + return +} + +// +// List Tickets.. +func (h *Ticket) List() (list []api.Ticket, err error) { + list = []api.Ticket{} + err = h.client.Get(api.TicketsRoot, &list) + return +} + +// +// Delete a Ticket. +func (h *Ticket) Delete(id uint) (err error) { + err = h.client.Delete(Path(api.TicketRoot).Inject(Params{api.ID: id})) + return +} diff --git a/docs/test-api-matrix.md b/docs/test-api-matrix.md index 1c4a1e63..774be208 100644 --- a/docs/test-api-matrix.md +++ b/docs/test-api-matrix.md @@ -25,7 +25,7 @@ ruleset|:heavy_check_mark:|:heavy_check_mark:|| **Migrationwaves and Jira**|||| batch|||| migrationwave|:heavy_check_mark:|:heavy_check_mark:|| -ticket|||| +ticket|:heavy_check_mark:|:heavy_check_mark:|| tracker|:heavy_check_mark:|:heavy_check_mark:|| **Assessments**|||| archetype|||| diff --git a/test/api/ticket/api_test.go b/test/api/ticket/api_test.go new file mode 100644 index 00000000..af6f277c --- /dev/null +++ b/test/api/ticket/api_test.go @@ -0,0 +1,152 @@ +package ticket + +import ( + "testing" + + "github.com/konveyor/tackle2-hub/api" + TrackerSamples "github.com/konveyor/tackle2-hub/test/api/tracker" + "github.com/konveyor/tackle2-hub/test/assert" +) + +func TestTicketCRUD(t *testing.T) { + for _, r := range Samples { + t.Run("Ticket "+r.Kind+" CRUD", func(t *testing.T) { + + // Create a sample Application for the ticket. + app := api.Application{ + Name: r.Application.Name, + } + assert.Must(t, Application.Create(&app)) + + createdIdentities := []api.Identity{} + createdTrackers := []api.Tracker{} + for _, tracker := range TrackerSamples.Samples { + // Create a sample identity for the tracker + identity := api.Identity{ + Name: tracker.Identity.Name, + Kind: tracker.Kind, + } + assert.Must(t, Identity.Create(&identity)) + createdIdentities = append(createdIdentities, identity) + assert.Must(t, Tracker.Create(&tracker)) + createdTrackers = append(createdTrackers, tracker) + } + + // Create a sample ticket + assert.Must(t, Ticket.Create(&r)) + + // Get. + got, err := Ticket.Get(r.ID) + if err != nil { + t.Errorf(err.Error()) + } + + // Compare got values with expected values. + AssertEqualTickets(t, got, r) + + // Delete ticket and its related resources. + assert.Must(t, Ticket.Delete(r.ID)) + for _, tracker := range createdTrackers { + assert.Must(t, Tracker.Delete(tracker.ID)) + } + for _, identity := range createdIdentities { + assert.Must(t, Identity.Delete(identity.ID)) + } + assert.Must(t, Application.Delete(app.ID)) + + // Check if the Ticket is present even after deletion or not. + _, err = Ticket.Get(r.ID) + if err == nil { + t.Errorf("Resource exits, but should be deleted: %v", r) + } + }) + } +} + +func TestTicketList(t *testing.T) { + for _, r := range Samples { + + createdTickets := []api.Ticket{} + // Create a sample Application for the ticket. + app := api.Application{ + Name: r.Application.Name, + } + assert.Must(t, Application.Create(&app)) + + createdIdentities := []api.Identity{} + createdTrackers := []api.Tracker{} + for _, tracker := range TrackerSamples.Samples { + // Create a sample identity for the tracker + identity := api.Identity{ + Name: tracker.Identity.Name, + Kind: tracker.Kind, + } + assert.Must(t, Identity.Create(&identity)) + createdIdentities = append(createdIdentities, identity) + assert.Must(t, Tracker.Create(&tracker)) + createdTrackers = append(createdTrackers, tracker) + } + + // Create a sample ticket + assert.Must(t, Ticket.Create(&r)) + createdTickets = append(createdTickets, r) + + // List Tickets. + got, err := Ticket.List() + if err != nil { + t.Errorf(err.Error()) + } + + for _, createdTicket := range createdTickets { + found := false + for _, retrievedTicket := range got { + if assert.FlatEqual(createdTicket.ID, retrievedTicket.ID) { + found = true + break + } + } + if !found { + t.Errorf("Expected ticket not found in the list: %v", createdTicket) + } + } + + // Delete tickets and related resources. + for _, ticket := range createdTickets { + assert.Must(t, Ticket.Delete(ticket.ID)) + assert.Must(t, Application.Delete(ticket.ID)) + } + for _, tracker := range createdTrackers { + assert.Must(t, Tracker.Delete(tracker.ID)) + } + for _, identity := range createdIdentities { + assert.Must(t, Identity.Delete(identity.ID)) + } + } +} + +func AssertEqualTickets(t *testing.T, got *api.Ticket, expected api.Ticket) { + if got.Kind != expected.Kind { + t.Errorf("Different Kind Got %v, expected %v", got.Kind, expected.Kind) + } + if got.Reference != expected.Reference { + t.Errorf("Different Tracker Reference Got %v, expected %v", got.Reference, expected.Reference) + } + if got.Link != expected.Link { + t.Errorf("Different Url Got %v, expected %v", got.Link, expected.Link) + } + if got.Parent != expected.Parent { + t.Errorf("Different Parent Got %v, expected %v", got.Parent, expected.Parent) + } + if got.Message != expected.Message { + t.Errorf("Different Message Got %v, expected %v", got.Message, expected.Message) + } + if got.Status != expected.Status { + t.Errorf("Different Status Got %v, expected %v", got.Status, expected.Status) + } + if got.Application.Name != expected.Application.Name { + t.Errorf("Different Application's Name Got %v, expected %v", got.Application.Name, expected.Application.Name) + } + if got.Tracker.Name != expected.Tracker.Name { + t.Errorf("Different Tracker's Name Got %v, expected %v", got.Tracker.Name, expected.Tracker.Name) + } +} diff --git a/test/api/ticket/pkg.go b/test/api/ticket/pkg.go new file mode 100644 index 00000000..f6f5aab7 --- /dev/null +++ b/test/api/ticket/pkg.go @@ -0,0 +1,31 @@ +package ticket + +import ( + "github.com/konveyor/tackle2-hub/binding" + "github.com/konveyor/tackle2-hub/test/api/client" +) + +var ( + RichClient *binding.RichClient + Ticket binding.Ticket + Tracker binding.Tracker + Identity binding.Identity + Application binding.Application +) + +func init() { + // Prepare RichClient and login to Hub API (configured from env variables). + RichClient = client.PrepareRichClient() + + // Shortcut for Ticket-related RichClient methods. + Ticket = RichClient.Ticket + + // Shortcut for Tracker-related RichClient methods. + Tracker = RichClient.Tracker + + // Shortcut for Identity-related RichClient methods. + Identity = RichClient.Identity + + // Shortcut for Application-related RichClient methods. + Application = RichClient.Application +} diff --git a/test/api/ticket/samples.go b/test/api/ticket/samples.go new file mode 100644 index 00000000..5a74246a --- /dev/null +++ b/test/api/ticket/samples.go @@ -0,0 +1,21 @@ +package ticket + +import ( + "github.com/konveyor/tackle2-hub/api" + TrackerSamples "github.com/konveyor/tackle2-hub/test/api/tracker" +) + +var Samples = []api.Ticket{ + { + Kind: "10001", + Parent: "10000", + Application: api.Ref{ + ID: 1, + Name: "Sample Application1", + }, + Tracker: api.Ref{ + ID: 1, + Name: TrackerSamples.Samples[0].Name, + }, + }, +}