diff --git a/binding/richclient.go b/binding/richclient.go index 56516580d..547e54d2e 100644 --- a/binding/richclient.go +++ b/binding/richclient.go @@ -38,6 +38,7 @@ type RichClient struct { TagCategory TagCategory Target Target Task Task + Tracker Tracker Dependency Dependency // A REST client. @@ -107,6 +108,9 @@ func New(baseUrl string) (r *RichClient) { Task: Task{ client: client, }, + Tracker: Tracker{ + client: client, + }, Client: client, } diff --git a/binding/tracker.go b/binding/tracker.go new file mode 100644 index 000000000..561a45f28 --- /dev/null +++ b/binding/tracker.go @@ -0,0 +1,74 @@ +package binding + +import ( + "github.com/konveyor/tackle2-hub/api" +) + +// +// Tracker API. +type Tracker struct { + client *Client +} + +// +// Create a Tracker. +func (h *Tracker) Create(r *api.Tracker) (err error) { + err = h.client.Post(api.TrackersRoot, &r) + return +} + +// +// Get a Tracker by ID. +func (h *Tracker) Get(id uint) (r *api.Tracker, err error) { + r = &api.Tracker{} + path := Path(api.TrackerRoot).Inject(Params{api.ID: id}) + err = h.client.Get(path, r) + return +} + +// +// List Trackers. +func (h *Tracker) List() (list []api.Tracker, err error) { + list = []api.Tracker{} + err = h.client.Get(api.TrackersRoot, &list) + return +} + +// +// Update a Tracker. +func (h *Tracker) Update(r *api.Tracker) (err error) { + path := Path(api.TrackerRoot).Inject(Params{api.ID: r.ID}) + err = h.client.Put(path, r) + return +} + +// +// Delete a Tracker. +func (h *Tracker) Delete(id uint) (err error) { + err = h.client.Delete(Path(api.TrackerRoot).Inject(Params{api.ID: id})) + return +} + +// +// List Projects. +func (h *Tracker) ListProjects(id uint) (projectList []api.Project, err error) { + projectList = []api.Project{} + err = h.client.Get(Path(api.TrackerProjects).Inject(Params{api.ID: id}), &projectList) + return +} + +// +// Get Projects. +func (h *Tracker) GetProjects(id1 uint, id2 uint) (project api.Project, err error) { + project = api.Project{} + err = h.client.Get(Path(api.TrackerProject).Inject(Params{api.ID: id1, api.ID2: id2}), &project) + return +} + +// +// List Project Issue Types. +func (h *Tracker) ListProjectIssueTypes(id1 uint, id2 uint) (issueType []api.IssueType, err error) { + issueType = []api.IssueType{} + err = h.client.Get(Path(api.TrackerProjectIssueTypes).Inject(Params{api.ID: id1, api.ID2: id2}), &issueType) + return +} diff --git a/docs/test-api-matrix.md b/docs/test-api-matrix.md index 2391f2bff..86c9a831e 100644 --- a/docs/test-api-matrix.md +++ b/docs/test-api-matrix.md @@ -26,7 +26,7 @@ ruleset|:heavy_check_mark:|:heavy_check_mark:|| batch|||| migrationwave|:heavy_check_mark:|:heavy_check_mark:|| ticket|||| -tracker|||| +tracker|:heavy_check_mark:|:heavy_check_mark:|| **Other**|||| addon || | | auth|||| diff --git a/test/api/tracker/api_test.go b/test/api/tracker/api_test.go new file mode 100644 index 000000000..3d720f909 --- /dev/null +++ b/test/api/tracker/api_test.go @@ -0,0 +1,186 @@ +package tracker + +import ( + "strconv" + "testing" + + "github.com/konveyor/tackle2-hub/api" + "github.com/konveyor/tackle2-hub/test/assert" +) + +func TestTrackerCRUD(t *testing.T) { + for _, r := range Samples { + t.Run("Tracker "+r.Kind+" CRUD", func(t *testing.T) { + // Create a sample identity for the tracker. + identity := api.Identity{ + Kind: r.Kind, + Name: r.Identity.Name, + } + assert.Must(t, Identity.Create(&identity)) + // Copy the identity name to the tracker. + r.Identity.ID = identity.ID + + // Create a tracker. + assert.Must(t, Tracker.Create(&r)) + + // Get. + got, err := Tracker.Get(r.ID) + if err != nil { + t.Errorf(err.Error()) + } + + // Compare got values with expected values. + AssertEqualTrackers(t, got, r) + + // Update Message. + r.Message = "Updated Comment " + r.Message + assert.Should(t, Tracker.Update(&r)) + + // Find Tracker and check its parameters with the got(On Updation). + got, err = Tracker.Get(r.ID) + if err != nil { + t.Errorf(err.Error()) + } + + // Check if the unchanged values remain same or not. + AssertEqualTrackers(t, got, r) + + // Delete identity and tracker. + assert.Must(t, Tracker.Delete(r.ID)) + assert.Must(t, Identity.Delete(identity.ID)) + + // Check if the Tracker is present even after deletion or not. + _, err = Tracker.Get(r.ID) + if err == nil { + t.Errorf("Resource exits, but should be deleted: %v", r) + } + }) + + t.Run("Tracker "+r.Kind+" Project", func(t *testing.T) { + // Create a sample identity for the tracker. + identity := api.Identity{ + Kind: r.Kind, + Name: r.Identity.Name, + } + assert.Must(t, Identity.Create(&identity)) + + // Copy the identity name to the tracker. + r.Identity.ID = identity.ID + + // Create a tracker. + assert.Must(t, Tracker.Create(&r)) + + projectsList, err := Tracker.ListProjects(r.ID) + if err != nil { + // check for type of service (maybe Connected?) + // if API service then print Not connected to Jira and pass the test + // else fail the test + if r.Connected == false { + t.Logf("Not connected to Jira(Thus passing the API Test)") + } else { + t.Errorf(err.Error()) + } + } + + for _, projects := range projectsList { + + // convert project Id's to uint. + projectID, err := strconv.Atoi(projects.ID) + if err != nil { + t.Errorf(err.Error()) + } + + _, err = Tracker.GetProjects(r.ID, uint(projectID)) + if err != nil { + if r.Connected == false { + t.Logf("Not connected to Jira(Thus passing the API Test)") + } else { + t.Errorf(err.Error()) + } + } + + _, err = Tracker.ListProjectIssueTypes(r.ID, uint(projectID)) + if err != nil { + if r.Connected == false { + t.Logf("Not connected to Jira(Thus passing the API Test)") + } else { + t.Errorf(err.Error()) + } + } + } + + // Delete identity and tracker. + assert.Must(t, Tracker.Delete(r.ID)) + assert.Must(t, Identity.Delete(identity.ID)) + + // Check if the Tracker is present even after deletion or not. + _, err = Tracker.Get(r.ID) + if err == nil { + t.Errorf("Resource exits, but should be deleted: %v", r) + } + }) + } +} + +func TestTrackerList(t *testing.T) { + createdTrackers := []api.Tracker{} + + for _, r := range Samples { + identity := api.Identity{ + Kind: r.Kind, + Name: r.Identity.Name, + } + assert.Must(t, Identity.Create(&identity)) + r.Identity.ID = identity.ID + + assert.Must(t, Tracker.Create(&r)) + createdTrackers = append(createdTrackers, r) + } + + // List Trackers. + got, err := Tracker.List() + if err != nil { + t.Errorf(err.Error()) + } + + // check if created Trackers are in the list we got from Tracker.List() + for _, createdTracker := range createdTrackers { + found := false + for _, retrievedTracker := range got { + if assert.FlatEqual(createdTracker.ID, retrievedTracker.ID) { + found = true + break + } + } + if !found { + t.Errorf("Expected tracker not found in the list: %v", createdTracker) + } + } + + // Delete related trackers and identities. + for _, tracker := range createdTrackers { + assert.Must(t, Tracker.Delete(tracker.ID)) + assert.Must(t, Identity.Delete(tracker.ID)) + } +} + +func AssertEqualTrackers(t *testing.T, got *api.Tracker, expected api.Tracker) { + if got.Name != expected.Name { + t.Errorf("Different Tracker Name Got %v, expected %v", got.Name, expected.Name) + } + if got.URL != expected.URL { + t.Errorf("Different Url Got %v, expected %v", got.URL, expected.URL) + } + if got.Kind != expected.Kind { + t.Errorf("Different Kind Got %v, expected %v", got.Kind, expected.Kind) + } + if got.Connected != expected.Connected { + t.Errorf("Different Connected Got %v, expected %v", got.Connected, expected.Connected) + } + if got.Identity.Name != expected.Identity.Name { + t.Errorf("Different Identity's Name Got %v, expected %v", got.Identity.Name, expected.Identity.Name) + } + if got.Insecure != expected.Insecure { + t.Errorf("Different Insecure Got %v, expected %v", got.Insecure, expected.Kind) + } +} diff --git a/test/api/tracker/pkg.go b/test/api/tracker/pkg.go new file mode 100644 index 000000000..a78df5e26 --- /dev/null +++ b/test/api/tracker/pkg.go @@ -0,0 +1,23 @@ +package tracker + +import ( + "github.com/konveyor/tackle2-hub/binding" + "github.com/konveyor/tackle2-hub/test/api/client" +) + +var ( + RichClient *binding.RichClient + Tracker binding.Tracker + Identity binding.Identity +) + +func init() { + // Prepare RichClient and login to Hub API (configured from env variables). + RichClient = client.PrepareRichClient() + + // Shortcut for Tracker-related RichClient methods. + Tracker = RichClient.Tracker + + // Shortcut for Identity-related RichClient methods. + Identity = RichClient.Identity +} diff --git a/test/api/tracker/samples.go b/test/api/tracker/samples.go new file mode 100644 index 000000000..1face0d01 --- /dev/null +++ b/test/api/tracker/samples.go @@ -0,0 +1,34 @@ +package tracker + +import ( + "time" + + "github.com/konveyor/tackle2-hub/api" +) + +var Samples = []api.Tracker{ + { + Name: "Sample tracker", + URL: "https://konveyor.io/test/api/tracker", + Kind: "jira-onprem", + Message: "Description of tracker", + LastUpdated: time.Date(time.Now().Year(), time.Now().Month(), time.Now().Day(), 0, 0, 0, 0, time.Local), + Identity: api.Ref{ + ID: 1, + Name: "Sample Tracker Identity", + }, + Insecure: false, + }, + { + Name: "Sample tracker1", + URL: "https://konveyor.io/test/api/tracker1", + Kind: "jira-cloud", + Message: "Description of tracker1", + LastUpdated: time.Date(time.Now().Year(), time.Now().Month(), time.Now().Day(), 0, 0, 0, 0, time.Local), + Identity: api.Ref{ + ID: 2, + Name: "Sample Tracker Identity1", + }, + Insecure: false, + }, +}