Skip to content

Commit

Permalink
Merge pull request #196 from mackerelio/add-org-package
Browse files Browse the repository at this point in the history
Create org package and add tests for org subcommand
  • Loading branch information
itchyny committed Mar 11, 2019
2 parents f953773 + de06a9e commit 5fb815d
Show file tree
Hide file tree
Showing 7 changed files with 119 additions and 30 deletions.
3 changes: 2 additions & 1 deletion commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/mackerelio/mkr/hosts"
"github.com/mackerelio/mkr/logger"
"github.com/mackerelio/mkr/mackerelclient"
"github.com/mackerelio/mkr/org"
"github.com/mackerelio/mkr/plugin"
"github.com/mackerelio/mkr/wrap"
cli "gopkg.in/urfave/cli.v1"
Expand All @@ -33,7 +34,7 @@ var Commands = []cli.Command{
commandAlerts,
commandDashboards,
commandAnnotations,
commandOrg,
org.Command,
plugin.CommandPlugin,
checks.Command,
wrap.Command,
Expand Down
1 change: 1 addition & 0 deletions mackerelclient/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ import mackerel "github.com/mackerelio/mackerel-client-go"
// Client represents a client of Mackerel API
type Client interface {
FindHosts(param *mackerel.FindHostsParam) ([]*mackerel.Host, error)
GetOrg() (*mackerel.Org, error)
}
16 changes: 16 additions & 0 deletions mackerelclient/mock_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import mackerel "github.com/mackerelio/mackerel-client-go"
// MockClient represents a mock client of Mackerel API
type MockClient struct {
findHostsCallback func(param *mackerel.FindHostsParam) ([]*mackerel.Host, error)
getOrgCallback func() (*mackerel.Org, error)
}

// MockClientOption represents an option of mock client of Mackerel API
Expand Down Expand Up @@ -44,3 +45,18 @@ func MockFindHosts(callback func(param *mackerel.FindHostsParam) ([]*mackerel.Ho
c.findHostsCallback = callback
}
}

// GetOrg ...
func (c *MockClient) GetOrg() (*mackerel.Org, error) {
if c.getOrgCallback != nil {
return c.getOrgCallback()
}
return nil, errCallbackNotFound("GetOrg")
}

// MockGetOrg returns an option to set the callback of GetOrg
func MockGetOrg(callback func() (*mackerel.Org, error)) MockClientOption {
return func(c *MockClient) {
c.getOrgCallback = callback
}
}
29 changes: 0 additions & 29 deletions org.go

This file was deleted.

23 changes: 23 additions & 0 deletions org/app.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org

import (
"io"

"github.com/mackerelio/mkr/format"
"github.com/mackerelio/mkr/mackerelclient"
)

type orgApp struct {
client mackerelclient.Client
outStream io.Writer
}

func (app *orgApp) run() error {
org, err := app.client.GetOrg()
if err != nil {
return err
}

format.PrettyPrintJSON(app.outStream, org)
return nil
}
45 changes: 45 additions & 0 deletions org/app_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package org

import (
"bytes"
"testing"

"github.com/stretchr/testify/assert"

mackerel "github.com/mackerelio/mackerel-client-go"

"github.com/mackerelio/mkr/mackerelclient"
)

func TestOrgApp_Run(t *testing.T) {
testCases := []struct {
id string
org *mackerel.Org
expected string
}{
{
id: "default",
org: &mackerel.Org{Name: "sample-org"},
expected: `{
"name": "sample-org"
}
`,
},
}
for _, tc := range testCases {
client := mackerelclient.NewMockClient(
mackerelclient.MockGetOrg(func() (*mackerel.Org, error) {
return tc.org, nil
}),
)
t.Run(tc.id, func(t *testing.T) {
out := new(bytes.Buffer)
app := &orgApp{
client: client,
outStream: out,
}
assert.NoError(t, app.run())
assert.Equal(t, tc.expected, out.String())
})
}
}
32 changes: 32 additions & 0 deletions org/command.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org

import (
"os"

cli "gopkg.in/urfave/cli.v1"

"github.com/mackerelio/mkr/mackerelclient"
)

// Command is the definition of org subcommand
var Command = cli.Command{
Name: "org",
Usage: "Fetch organization",
Description: `
Fetch organization.
Requests APIs under "/api/v0/org". See https://mackerel.io/api-docs/entry/organizations .
`,
Action: doOrg,
}

func doOrg(c *cli.Context) error {
client, err := mackerelclient.New(c.GlobalString("conf"), c.GlobalString("apibase"))
if err != nil {
return err
}

return (&orgApp{
client: client,
outStream: os.Stdout,
}).run()
}

0 comments on commit 5fb815d

Please sign in to comment.