Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions internal/cmd/cmd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -620,6 +620,14 @@ func (m *mockDoer) Do(result interface{}, method, ver, path string, reqPars map[
b, _ := json.Marshal(validation)
return json.Unmarshal(b, result)
}
if method == "POST" && strings.HasPrefix(path, "/projects/") && strings.HasSuffix(path, "/commit") {
b, _ := json.Marshal("Commit successful")
return json.Unmarshal(b, result)
}
if method == "POST" && strings.HasPrefix(path, "/projects/") && strings.HasSuffix(path, "/push_branch") {
b, _ := json.Marshal("Push successful")
return json.Unmarshal(b, result)
}

return fmt.Errorf("mock path not found: %s", path)
}
Expand Down Expand Up @@ -1839,6 +1847,71 @@ func TestProjectValidateCommand(t *testing.T) {
})
}

func TestProjectCommitCommand(t *testing.T) {
MockSDK = v4.NewLookerSDK(&mockDoer{t: t})
defer func() { MockSDK = nil }()

t.Run("commit with message and files", func(t *testing.T) {
oldStdout := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w

RootCmd.SetArgs([]string{"project", "commit", "my_proj", "file1.lkml", "file2.lkml", "-m", "Initial commit", "--amend"})
err := RootCmd.Execute()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}

_ = w.Close()
os.Stdout = oldStdout
var buf bytes.Buffer
_, _ = io.Copy(&buf, r)
out := buf.String()

if !strings.Contains(out, "Commit successful") {
t.Errorf("expected Commit successful, got %q", out)
}
})

t.Run("commit missing required message flag", func(t *testing.T) {
projectCommitMessage = ""
_ = projectCommitCmd.Flags().Lookup("message").Value.Set("")
projectCommitCmd.Flags().Lookup("message").Changed = false
RootCmd.SetArgs([]string{"project", "commit", "my_proj"})
err := RootCmd.Execute()
if err == nil {
t.Fatalf("expected error for missing --message flag, got nil")
}
})
}

func TestProjectPushBranchCommand(t *testing.T) {
MockSDK = v4.NewLookerSDK(&mockDoer{t: t})
defer func() { MockSDK = nil }()

t.Run("push-branch command", func(t *testing.T) {
oldStdout := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w

RootCmd.SetArgs([]string{"project", "push-branch", "my_proj"})
err := RootCmd.Execute()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}

_ = w.Close()
os.Stdout = oldStdout
var buf bytes.Buffer
_, _ = io.Copy(&buf, r)
out := buf.String()

if !strings.Contains(out, "Push successful") {
t.Errorf("expected Push successful, got %q", out)
}
})
}

func TestDashboardImportCommand(t *testing.T) {
doer := &mockDoer{t: t}
MockSDK = v4.NewLookerSDK(doer)
Expand Down
108 changes: 96 additions & 12 deletions internal/cmd/project.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,25 +17,28 @@ package cmd
import (
"encoding/json"
"fmt"
"net/url"
"os"
"strings"

"github.com/spf13/cobra"
v4 "github.com/looker-open-source/sdk-codegen/go/sdk/v4"
"github.com/looker-open-source/looker-cli/internal/util"
v4 "github.com/looker-open-source/sdk-codegen/go/sdk/v4"
"github.com/spf13/cobra"
)

var (
projectLsFields string
projectLsPlain bool
projectLsCSV bool
projectCatFields string
projectCatDir string
projectCatTrim bool
projectBranchAll bool
projectBranchFields string
projectBranchPlain bool
projectBranchCSV bool
projectLsFields string
projectLsPlain bool
projectLsCSV bool
projectCatFields string
projectCatDir string
projectCatTrim bool
projectBranchAll bool
projectBranchFields string
projectBranchPlain bool
projectBranchCSV bool
projectCommitMessage string
projectCommitAmend bool
projectValidateFields string
projectValidatePlain bool
projectValidateCSV bool
Expand Down Expand Up @@ -180,6 +183,81 @@ var projectDeployKeyCmd = &cobra.Command{
},
}

type projectCommitRequest struct {
Files *[]string `json:"files,omitempty"`
Message *string `json:"message,omitempty"`
Amend *bool `json:"amend,omitempty"`
}
Comment thread
drstrangelooker marked this conversation as resolved.

var projectCommitCmd = &cobra.Command{
Use: "commit [PROJECT_ID] [FILES...]",
Short: "Commit changes in a project",
Args: cobra.MinimumNArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
c, err := initClient(cmd.Context(), false)
if err != nil {
return err
}
pID := args[0]
req := projectCommitRequest{}

if cmd.Flags().Changed("message") || projectCommitMessage != "" {
req.Message = &projectCommitMessage
}

if len(args) > 1 {
files := args[1:]
req.Files = &files
}

if cmd.Flags().Changed("amend") || projectCommitAmend {
req.Amend = &projectCommitAmend
}
Comment thread
drstrangelooker marked this conversation as resolved.

var result string
path := fmt.Sprintf("/projects/%s/commit", url.PathEscape(pID))
err = c.SDK.AuthSession.Do(&result, "POST", "/4.0", path, nil, req, nil)
if err != nil {
return err
}

if strings.TrimSpace(result) != "" {
fmt.Println(result)
} else {
fmt.Printf("Committed changes for project %s.\n", pID)
}
return nil
},
}

var projectPushBranchCmd = &cobra.Command{
Use: "push-branch [PROJECT_ID]",
Aliases: []string{"push"},
Short: "Push active branch of a project to remote",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
c, err := initClient(cmd.Context(), false)
if err != nil {
return err
}
pID := args[0]

var result string
path := fmt.Sprintf("/projects/%s/push_branch", url.PathEscape(pID))
err = c.SDK.AuthSession.Do(&result, "POST", "/4.0", path, nil, nil, nil)
if err != nil {
return err
}

if strings.TrimSpace(result) != "" {
fmt.Println(result)
} else {
fmt.Printf("Pushed branch for project %s.\n", pID)
}
return nil
},
}

var projectBranchCmd = &cobra.Command{
Use: "branch [PROJECT_ID]",
Short: "List active branch or all branches of a project",
Expand Down Expand Up @@ -302,6 +380,8 @@ func init() {
ProjectCmd.AddCommand(projectImportCmd)
ProjectCmd.AddCommand(projectUpdateCmd)
ProjectCmd.AddCommand(projectBranchCmd)
ProjectCmd.AddCommand(projectCommitCmd)
ProjectCmd.AddCommand(projectPushBranchCmd)
ProjectCmd.AddCommand(projectDeployCmd)
ProjectCmd.AddCommand(projectCheckoutCmd)
ProjectCmd.AddCommand(projectCreateCmd)
Expand All @@ -322,6 +402,10 @@ func init() {
projectBranchCmd.Flags().BoolVar(&projectBranchPlain, "plain", false, "print without formatting")
projectBranchCmd.Flags().BoolVar(&projectBranchCSV, "csv", false, "output in csv format")

projectCommitCmd.Flags().StringVarP(&projectCommitMessage, "message", "m", "", "Commit message")
_ = projectCommitCmd.MarkFlagRequired("message")
projectCommitCmd.Flags().BoolVar(&projectCommitAmend, "amend", false, "Amend the last commit")

projectValidateCmd.Flags().StringVar(&projectValidateFields, "fields", "severity,file_path,line_number,message", "Fields to display")
projectValidateCmd.Flags().BoolVar(&projectValidatePlain, "plain", false, "print without formatting")
projectValidateCmd.Flags().BoolVar(&projectValidateCSV, "csv", false, "output in csv format")
Expand Down
Loading