Skip to content

Commit

Permalink
Added Unit test case for events sub commands
Browse files Browse the repository at this point in the history
  • Loading branch information
codinja1188 committed Jul 20, 2023
1 parent 198710b commit cd568de
Show file tree
Hide file tree
Showing 4 changed files with 174 additions and 20 deletions.
3 changes: 3 additions & 0 deletions internal/events/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ func (c *Client) NewCommand() *cobra.Command {
type Servicer interface {
MetalAPI(*cobra.Command) *metal.APIClient
Format() outputs.Format
Filters() map[string]string
Includes(defaultIncludes []string) (incl []string)
Excludes(defaultExcludes []string) (excl []string)
}

func NewClient(s Servicer, out outputs.Outputer) *Client {
Expand Down
26 changes: 15 additions & 11 deletions internal/events/retrieve.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ func (c *Client) Retrieve() *cobra.Command {
var err error
header := []string{"ID", "Body", "Type", "Created"}
inc := []string{}
exc := []string{}

// only fetch extra details when rendered
switch c.Servicer.Format() {
Expand All @@ -70,34 +69,39 @@ func (c *Client) Retrieve() *cobra.Command {
if deviceID != "" && projectID != "" && organizationID != "" && eventID != "" {
return fmt.Errorf("id, project-id, device-id, and organization-id parameters are mutually exclusive")
} else if deviceID != "" {
events, err = pager.GetDeviceEvents(c.EventService, deviceID, inc, exc)
deviceRequest := c.EventService.FindDeviceEvents(context.Background(), deviceID).Include(c.Servicer.Includes(inc)).Exclude(c.Servicer.Excludes(nil))
events, err = pager.GetDeviceEvents(deviceRequest)
if err != nil {
return fmt.Errorf("Could not list Device Events: %w", err)
return fmt.Errorf("could not list Device Events: %w", err)
}
} else if projectID != "" {
events, err = pager.GetProjectEvents(c.EventService, projectID, inc, exc)
projRequest := c.EventService.FindProjectEvents(context.Background(), projectID).Include(c.Servicer.Includes(inc)).Exclude(c.Servicer.Excludes(nil))
events, err = pager.GetProjectEvents(projRequest)
if err != nil {
return fmt.Errorf("Could not list Project Events: %w", err)
return fmt.Errorf("could not list Project Events: %w", err)
}
} else if organizationID != "" {
events, err = pager.GetOrganizationEvents(c.EventService, organizationID, inc, exc)

orgRequest := c.EventService.FindOrganizationEvents(context.Background(), organizationID).Include(c.Servicer.Includes(inc)).Exclude(c.Servicer.Excludes(nil))
events, err = pager.GetOrganizationEvents(orgRequest)
if err != nil {
return fmt.Errorf("Could not list Organization Events: %w", err)
return fmt.Errorf("could not list Organization Events: %w", err)
}
} else if eventID != "" {
event, _, err := c.EventService.FindEventById(context.Background(), eventID).Include(inc).Exclude(exc).Execute()
event, _, err := c.EventService.FindEventById(context.Background(), eventID).Include(c.Servicer.Includes(inc)).Exclude(c.Servicer.Excludes(nil)).Execute()
if err != nil {
return fmt.Errorf("Could not get Event: %w", err)
return fmt.Errorf("could not get Event: %w", err)
}

data := make([][]string, 1)

data[0] = []string{event.GetId(), event.GetBody(), event.GetType(), event.GetCreatedAt().String()}
return c.Out.Output(event, header, &data)
} else {
events, err = pager.GetAllEvents(c.EventService, inc, exc)
request := c.EventService.FindEvents(context.Background()).Include(c.Servicer.Includes(inc)).Exclude(c.Servicer.Excludes(nil))
events, err = pager.GetAllEvents(request)
if err != nil {
return fmt.Errorf("Could not list Events: %w", err)
return fmt.Errorf("could not list Events: %w", err)
}
}

Expand Down
17 changes: 8 additions & 9 deletions internal/pagination/pager.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,14 @@ func GetAllProjects(s metal.ProjectsApiService, include []string, exclude []stri
}
}

func GetDeviceEvents(s metal.EventsApiService, deviceId string, include []string, exclude []string) ([]metal.Event, error) {
func GetDeviceEvents(s metal.ApiFindDeviceEventsRequest) ([]metal.Event, error) {
var events []metal.Event

page := int32(1) // int32 | Page to return (optional) (default to 1)
perPage := int32(20) // int32 | Items returned per page (optional) (default to 10)

for {
eventsPage, _, err := s.FindDeviceEvents(context.Background(), deviceId).Include(include).Exclude(exclude).Page(page).PerPage(perPage).Execute()
eventsPage, _, err := s.Page(page).PerPage(perPage).Execute()
if err != nil {
return nil, err
}
Expand All @@ -46,14 +46,14 @@ func GetDeviceEvents(s metal.EventsApiService, deviceId string, include []string
}
}

func GetProjectEvents(s metal.EventsApiService, projectId string, include []string, exclude []string) ([]metal.Event, error) {
func GetProjectEvents(s metal.ApiFindProjectEventsRequest) ([]metal.Event, error) {
var events []metal.Event

page := int32(1) // int32 | Page to return (optional) (default to 1)
perPage := int32(20) // int32 | Items returned per page (optional) (default to 10)

for {
eventsPage, _, err := s.FindProjectEvents(context.Background(), projectId).Include(include).Exclude(exclude).Page(page).PerPage(perPage).Execute()
eventsPage, _, err := s.Page(page).PerPage(perPage).Execute()
if err != nil {
return nil, err
}
Expand All @@ -67,14 +67,14 @@ func GetProjectEvents(s metal.EventsApiService, projectId string, include []stri
}
}

func GetOrganizationEvents(s metal.EventsApiService, orgId string, include []string, exclude []string) ([]metal.Event, error) {
func GetOrganizationEvents(s metal.ApiFindOrganizationEventsRequest) ([]metal.Event, error) {
var events []metal.Event

page := int32(1) // int32 | Page to return (optional) (default to 1)
perPage := int32(20) // int32 | Items returned per page (optional) (default to 10)

for {
eventsPage, _, err := s.FindOrganizationEvents(context.Background(), orgId).Include(include).Exclude(exclude).Page(page).PerPage(perPage).Execute()
eventsPage, _, err := s.Page(page).PerPage(perPage).Execute()
if err != nil {
return nil, err
}
Expand All @@ -88,14 +88,13 @@ func GetOrganizationEvents(s metal.EventsApiService, orgId string, include []str
}
}

func GetAllEvents(s metal.EventsApiService, include []string, exclude []string) ([]metal.Event, error) {
func GetAllEvents(s metal.ApiFindEventsRequest) ([]metal.Event, error) {
var events []metal.Event

page := int32(1) // int32 | Page to return (optional) (default to 1)
perPage := int32(20) // int32 | Items returned per page (optional) (default to 10)

for {
eventsPage, _, err := s.FindEvents(context.Background()).Include(include).Exclude(exclude).Page(page).PerPage(perPage).Execute()
eventsPage, _, err := s.Page(page).PerPage(perPage).Execute()
if err != nil {
return nil, err
}
Expand Down
148 changes: 148 additions & 0 deletions test/e2e/event_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
package e2e

Check failure on line 1 in test/e2e/event_test.go

View workflow job for this annotation

GitHub Actions / lint

: # github.com/equinix/metal-cli/test/e2e [github.com/equinix/metal-cli/test/e2e.test]

import (
"io"
"os"
"strings"
"testing"

root "github.com/equinix/metal-cli/internal/cli"
"github.com/equinix/metal-cli/internal/events"
outputPkg "github.com/equinix/metal-cli/internal/outputs"
"github.com/spf13/cobra"
)

func TestCli_Plans(t *testing.T) {

Check failure on line 15 in test/e2e/event_test.go

View workflow job for this annotation

GitHub Actions / lint

other declaration of TestCli_Plans (typecheck)
subCommand := "event"
consumerToken := ""
apiURL := ""
Version := "metal"
rootClient := root.NewClient(consumerToken, apiURL, Version)
type fields struct {
MainCmd *cobra.Command
Outputer outputPkg.Outputer
}
tests := []struct {
name string
fields fields
want *cobra.Command
cmdFunc func(*testing.T, *cobra.Command)
}{
{
name: "get",
fields: fields{
MainCmd: events.NewClient(rootClient, outputPkg.Outputer(&outputPkg.Standard{})).NewCommand(),
Outputer: outputPkg.Outputer(&outputPkg.Standard{}),
},
want: &cobra.Command{},
cmdFunc: func(t *testing.T, c *cobra.Command) {
root := c.Root()
root.SetArgs([]string{subCommand, "get"})
rescueStdout := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w
if err := root.Execute(); err != nil {
t.Error(err)
}
w.Close()
out, _ := io.ReadAll(r)
os.Stdout = rescueStdout
if !strings.Contains(string(out[:]), "instance.created") &&
!strings.Contains(string(out[:]), "instance.deleted") &&
!strings.Contains(string(out[:]), "ssh_key.created") &&
!strings.Contains(string(out[:]), "ssh_key.deleted") {
t.Error("expected output should include instance.created, instance.deleted, ssh_key.created, ssh_key.deleted by TYPE")
}
},
},
{
name: "get_by_orgID",
fields: fields{
MainCmd: events.NewClient(rootClient, outputPkg.Outputer(&outputPkg.Standard{})).NewCommand(),
Outputer: outputPkg.Outputer(&outputPkg.Standard{}),
},
want: &cobra.Command{},
cmdFunc: func(t *testing.T, c *cobra.Command) {
root := c.Root()
root.SetArgs([]string{subCommand, "get", "--token", os.Getenv("METAL_AUTH_TOKEN"), "-o", os.Getenv("METAL_ORG_ID")})
rescueStdout := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w
if err := root.Execute(); err != nil {
t.Error(err)
}
w.Close()
out, _ := io.ReadAll(r)
os.Stdout = rescueStdout
if !strings.Contains(string(out[:]), "instance.created") &&
!strings.Contains(string(out[:]), "instance.deleted") &&
!strings.Contains(string(out[:]), "ssh_key.created") &&
!strings.Contains(string(out[:]), "ssh_key.deleted") {
t.Error("expected output should include instance.created, instance.deleted, ssh_key.created, ssh_key.deleted by TYPE")
}
},
},
{
name: "get_by_projID",
fields: fields{
MainCmd: events.NewClient(rootClient, outputPkg.Outputer(&outputPkg.Standard{})).NewCommand(),
Outputer: outputPkg.Outputer(&outputPkg.Standard{}),
},
want: &cobra.Command{},
cmdFunc: func(t *testing.T, c *cobra.Command) {
root := c.Root()
root.SetArgs([]string{subCommand, "get", "--token", os.Getenv("METAL_AUTH_TOKEN"), "-p", os.Getenv("METAL_PROJ_ID")})
rescueStdout := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w
if err := root.Execute(); err != nil {
t.Error(err)
}
w.Close()
out, _ := io.ReadAll(r)
os.Stdout = rescueStdout
if !strings.Contains(string(out[:]), "instance.created") &&
!strings.Contains(string(out[:]), "instance.deleted") &&
!strings.Contains(string(out[:]), "ssh_key.created") &&
!strings.Contains(string(out[:]), "ssh_key.deleted") {
t.Error("expected output should include instance.created, instance.deleted, ssh_key.created, ssh_key.deleted by TYPE")
}
},
},
{
name: "get_by_DeviceID",
fields: fields{
MainCmd: events.NewClient(rootClient, outputPkg.Outputer(&outputPkg.Standard{})).NewCommand(),
Outputer: outputPkg.Outputer(&outputPkg.Standard{}),
},
want: &cobra.Command{},
cmdFunc: func(t *testing.T, c *cobra.Command) {
root := c.Root()
root.SetArgs([]string{subCommand, "get", "--token", os.Getenv("METAL_AUTH_TOKEN"), "-p", os.Getenv("METAL_DEVICE_ID")})
rescueStdout := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w
if err := root.Execute(); err != nil {
t.Error(err)
}
w.Close()
out, _ := io.ReadAll(r)
os.Stdout = rescueStdout
if !strings.Contains(string(out[:]), "instance.created") &&
!strings.Contains(string(out[:]), "instance.deleted") &&
!strings.Contains(string(out[:]), "ssh_key.created") &&
!strings.Contains(string(out[:]), "ssh_key.deleted") {
t.Error("expected output should include instance.created, instance.deleted, ssh_key.created, ssh_key.deleted by TYPE")
}
},
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rootCmd := rootClient.NewCommand()
rootCmd.AddCommand(tt.fields.MainCmd)
tt.cmdFunc(t, tt.fields.MainCmd)
})
}
}

0 comments on commit cd568de

Please sign in to comment.