mirror of
https://github.com/fleetdm/fleet
synced 2026-05-24 09:28:54 +00:00
For #28932 No functional changes. Left the parent directory (also named fleetctl) with the main package as is not to break/change any other flows. This PR is the first step before refactoring integration tests to speed up (parallelize) fleetctl tests.
152 lines
3.5 KiB
Go
152 lines
3.5 KiB
Go
package fleetctl
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/fleetdm/fleet/v4/server/config"
|
|
"github.com/fleetdm/fleet/v4/server/fleet"
|
|
"github.com/fleetdm/fleet/v4/server/service"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// TestRunApiCommand checks that the usage of `api` command works as expected
|
|
func TestRunApiCommand(t *testing.T) {
|
|
cfg := config.TestConfig()
|
|
_, ds := runServerWithMockedDS(t, &service.TestServerOpts{
|
|
License: &fleet.LicenseInfo{Tier: fleet.TierPremium, Expiration: time.Now().Add(24 * time.Hour)},
|
|
FleetConfig: &cfg,
|
|
})
|
|
|
|
created_at, err := time.Parse(time.RFC3339, "1999-03-10T02:45:06.371Z")
|
|
require.NoError(t, err)
|
|
|
|
type testCase struct {
|
|
name string
|
|
args []string
|
|
expectOutput string
|
|
expectErrMsg string
|
|
}
|
|
|
|
expectedScripts := `{
|
|
"meta": {
|
|
"has_next_results": false,
|
|
"has_previous_results": false
|
|
},
|
|
"scripts": [
|
|
{
|
|
"id": 23,
|
|
"team_id": null,
|
|
"name": "get_my_device_page.sh",
|
|
"created_at": "%s",
|
|
"updated_at": "%s"
|
|
}
|
|
]
|
|
}
|
|
`
|
|
|
|
expectedEmptyScripts := `{
|
|
"meta": {
|
|
"has_next_results": false,
|
|
"has_previous_results": false
|
|
},
|
|
"scripts": []
|
|
}
|
|
`
|
|
|
|
cases := []testCase{
|
|
{
|
|
name: "get scripts",
|
|
args: []string{"scripts"},
|
|
expectOutput: fmt.Sprintf(
|
|
expectedScripts,
|
|
created_at.Format(time.RFC3339Nano),
|
|
created_at.Format(time.RFC3339Nano)),
|
|
},
|
|
{
|
|
name: "get /scripts",
|
|
args: []string{"/scripts"},
|
|
expectOutput: fmt.Sprintf(
|
|
expectedScripts,
|
|
created_at.Format(time.RFC3339Nano),
|
|
created_at.Format(time.RFC3339Nano)),
|
|
},
|
|
{
|
|
name: "get scripts full path",
|
|
args: []string{"/api/v1/fleet/scripts"},
|
|
expectOutput: fmt.Sprintf(
|
|
expectedScripts,
|
|
created_at.Format(time.RFC3339Nano),
|
|
created_at.Format(time.RFC3339Nano)),
|
|
},
|
|
{
|
|
name: "get scripts full path missing /",
|
|
args: []string{"api/v1/fleet/scripts"},
|
|
expectOutput: fmt.Sprintf(
|
|
expectedScripts,
|
|
created_at.Format(time.RFC3339Nano),
|
|
created_at.Format(time.RFC3339Nano)),
|
|
},
|
|
{
|
|
name: "get scripts team",
|
|
args: []string{"-F", "team_id=1", "scripts"},
|
|
expectOutput: expectedEmptyScripts,
|
|
},
|
|
{
|
|
name: "get scripts team no cache",
|
|
args: []string{"-H", "cache-control:no-cache", "-F", "team_id=1", "scripts"},
|
|
expectOutput: expectedEmptyScripts,
|
|
},
|
|
{
|
|
name: "get typo",
|
|
args: []string{"vresion"},
|
|
expectErrMsg: "Got non 2XX return of 404",
|
|
},
|
|
}
|
|
|
|
setupDS := func(t *testing.T, c testCase) {
|
|
ds.ListScriptsFunc = func(ctx context.Context, teamID *uint, opt fleet.ListOptions) ([]*fleet.Script, *fleet.PaginationMetadata, error) {
|
|
if teamID == nil {
|
|
ret := []*fleet.Script{
|
|
&fleet.Script{
|
|
ID: 23,
|
|
Name: "get_my_device_page.sh",
|
|
CreatedAt: created_at,
|
|
UpdatedAt: created_at,
|
|
},
|
|
}
|
|
page := fleet.PaginationMetadata{}
|
|
return ret, &page, nil
|
|
}
|
|
return []*fleet.Script{}, &fleet.PaginationMetadata{}, nil
|
|
}
|
|
}
|
|
|
|
for _, c := range cases {
|
|
t.Run(c.name, func(t *testing.T) {
|
|
setupDS(t, c)
|
|
args := []string{"api"}
|
|
|
|
args = append(args, c.args...)
|
|
|
|
b, err := runAppNoChecks(args)
|
|
if c.expectErrMsg != "" {
|
|
require.Error(t, err)
|
|
require.Contains(t, err.Error(), c.expectErrMsg)
|
|
} else {
|
|
require.NoError(t, err)
|
|
}
|
|
if c.expectOutput != "" {
|
|
out := b.String()
|
|
require.NoError(t, err)
|
|
require.NotEmpty(t, out)
|
|
require.Equal(t, c.expectOutput, out)
|
|
} else {
|
|
require.Empty(t, b.String())
|
|
}
|
|
})
|
|
}
|
|
|
|
}
|