diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 729e822..dce4fe8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,5 +14,11 @@ jobs: - uses: actions/setup-go@v6 with: go-version-file: go.mod + - run: | + unformatted=$(gofmt -l .) + if [ -n "$unformatted" ]; then + echo "$unformatted" + exit 1 + fi - run: npm install -g @go-task/cli - run: task test diff --git a/cmd/api_key.go b/cmd/api_key.go index f9e72ef..fd0c20c 100644 --- a/cmd/api_key.go +++ b/cmd/api_key.go @@ -3,8 +3,8 @@ package cmd import ( "fmt" - "github.com/loops-so/loops-go" "github.com/loops-so/cli/internal/config" + "github.com/loops-so/loops-go" "github.com/spf13/cobra" ) diff --git a/cmd/auth_login.go b/cmd/auth_login.go index 5dbb317..af8e88f 100644 --- a/cmd/auth_login.go +++ b/cmd/auth_login.go @@ -6,8 +6,8 @@ import ( "os" "strings" - "github.com/loops-so/loops-go" "github.com/loops-so/cli/internal/config" + "github.com/loops-so/loops-go" "github.com/spf13/cobra" "golang.org/x/term" ) diff --git a/cmd/auth_status.go b/cmd/auth_status.go index 08c13d8..0043443 100644 --- a/cmd/auth_status.go +++ b/cmd/auth_status.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" - "github.com/loops-so/loops-go" "github.com/loops-so/cli/internal/config" + "github.com/loops-so/loops-go" "github.com/spf13/cobra" ) diff --git a/cmd/contact_properties.go b/cmd/contact_properties.go index d3869a2..409f23f 100644 --- a/cmd/contact_properties.go +++ b/cmd/contact_properties.go @@ -3,8 +3,8 @@ package cmd import ( "fmt" - "github.com/loops-so/loops-go" "github.com/loops-so/cli/internal/config" + "github.com/loops-so/loops-go" "github.com/spf13/cobra" ) diff --git a/cmd/contacts.go b/cmd/contacts.go index 82c765b..e4ac608 100644 --- a/cmd/contacts.go +++ b/cmd/contacts.go @@ -6,9 +6,9 @@ import ( "strconv" "strings" - "github.com/loops-so/loops-go" "github.com/loops-so/cli/internal/cmdutil" "github.com/loops-so/cli/internal/config" + "github.com/loops-so/loops-go" "github.com/spf13/cobra" ) diff --git a/cmd/contacts_suppression.go b/cmd/contacts_suppression.go index 9d9230f..551b11d 100644 --- a/cmd/contacts_suppression.go +++ b/cmd/contacts_suppression.go @@ -3,8 +3,8 @@ package cmd import ( "fmt" - "github.com/loops-so/loops-go" "github.com/loops-so/cli/internal/config" + "github.com/loops-so/loops-go" "github.com/spf13/cobra" ) diff --git a/cmd/events.go b/cmd/events.go index a62d4ab..580f579 100644 --- a/cmd/events.go +++ b/cmd/events.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" - "github.com/loops-so/loops-go" "github.com/loops-so/cli/internal/cmdutil" "github.com/loops-so/cli/internal/config" + "github.com/loops-so/loops-go" "github.com/spf13/cobra" ) diff --git a/cmd/events_test.go b/cmd/events_test.go index 04d304f..9eb5537 100644 --- a/cmd/events_test.go +++ b/cmd/events_test.go @@ -10,8 +10,8 @@ import ( "strings" "testing" - "github.com/loops-so/loops-go" "github.com/loops-so/cli/internal/cmdutil" + "github.com/loops-so/loops-go" "github.com/zalando/go-keyring" ) diff --git a/cmd/groups.go b/cmd/groups.go index d63a2a6..0c03c9b 100644 --- a/cmd/groups.go +++ b/cmd/groups.go @@ -13,13 +13,13 @@ import ( // Both group types share the same Group/CreateGroupRequest/UpdateGroupRequest // shapes, so the command tree is built once and dispatched twice. type groupCmdSet struct { - use string // top-level command name, e.g. "campaign-groups" - idLabel string // table label for the id, e.g. "campaignGroupId" - singular string // for help text, e.g. "campaign group" - runList func(*config.Config, loops.PaginationParams) ([]loops.Group, error) - runGet func(*config.Config, string) (*loops.Group, error) - runCreate func(*config.Config, loops.CreateGroupRequest) (*loops.Group, error) - runUpdate func(*config.Config, string, loops.UpdateGroupRequest) (*loops.Group, error) + use string // top-level command name, e.g. "campaign-groups" + idLabel string // table label for the id, e.g. "campaignGroupId" + singular string // for help text, e.g. "campaign group" + runList func(*config.Config, loops.PaginationParams) ([]loops.Group, error) + runGet func(*config.Config, string) (*loops.Group, error) + runCreate func(*config.Config, loops.CreateGroupRequest) (*loops.Group, error) + runUpdate func(*config.Config, string, loops.UpdateGroupRequest) (*loops.Group, error) } // --- SDK method wrappers (one per resource × verb). diff --git a/cmd/lists.go b/cmd/lists.go index 9a3e59b..f97798e 100644 --- a/cmd/lists.go +++ b/cmd/lists.go @@ -3,8 +3,8 @@ package cmd import ( "fmt" - "github.com/loops-so/loops-go" "github.com/loops-so/cli/internal/config" + "github.com/loops-so/loops-go" "github.com/spf13/cobra" ) diff --git a/cmd/workflows.go b/cmd/workflows.go index f564e20..df55aef 100644 --- a/cmd/workflows.go +++ b/cmd/workflows.go @@ -307,6 +307,7 @@ func workflowNodeRows(n *loops.WorkflowNode) [][2]string { addCommon(v.ID, v.WorkflowID, v.NextNodeIDs) add("audienceSegmentId", v.AudienceSegmentID) add("audienceFilter", formatAudienceFilter(v.AudienceFilter)) + add("appliesDownstream", strconv.FormatBool(v.AppliesDownstream)) } case loops.WorkflowNodeTypeTimerAction: if v := n.TimerAction; v != nil { diff --git a/cmd/workflows_nodes_get_test.go b/cmd/workflows_nodes_get_test.go index ce10613..5e4b65a 100644 --- a/cmd/workflows_nodes_get_test.go +++ b/cmd/workflows_nodes_get_test.go @@ -93,6 +93,40 @@ func TestRunWorkflowsNodeGet(t *testing.T) { } }) + t.Run("decodes and renders audience filter appliesDownstream", func(t *testing.T) { + body := `{ + "typeName": "AudienceFilter", + "id": "node_af", + "workflowId": "wf_123", + "nextNodeIds": ["node_next"], + "audienceSegmentId": "seg_1", + "appliesDownstream": true + }` + serveJSON(t, http.StatusOK, body) + + n, err := runWorkflowsNodeGet(cfg(t), "wf_123", "node_af") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if n.AudienceFilter == nil { + t.Fatal("AudienceFilter = nil, want populated") + } + if !n.AudienceFilter.AppliesDownstream { + t.Error("AppliesDownstream = false, want true") + } + + got := map[string]string{} + for _, r := range workflowNodeRows(&n.WorkflowNode) { + got[r[0]] = r[1] + } + if got["audienceSegmentId"] != "seg_1" { + t.Errorf("audienceSegmentId = %q, want seg_1", got["audienceSegmentId"]) + } + if got["appliesDownstream"] != "true" { + t.Errorf("appliesDownstream = %q, want true", got["appliesDownstream"]) + } + }) + t.Run("returns error on non-200 response", func(t *testing.T) { serveJSON(t, http.StatusNotFound, `{"success":false,"message":"Node not found"}`) _, err := runWorkflowsNodeGet(cfg(t), "wf_123", "node_missing") diff --git a/go.mod b/go.mod index a8dc0e0..7fb9d23 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/atotto/clipboard v0.1.4 github.com/charmbracelet/colorprofile v0.4.2 github.com/charmbracelet/x/term v0.2.2 - github.com/loops-so/loops-go v0.6.0 + github.com/loops-so/loops-go v0.6.1 github.com/spf13/cobra v1.10.2 github.com/spf13/pflag v1.0.10 github.com/zalando/go-keyring v0.2.6 diff --git a/go.sum b/go.sum index 0cdf174..30ac563 100644 --- a/go.sum +++ b/go.sum @@ -299,8 +299,8 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/loops-so/loops-go v0.6.0 h1:j0D5W3iRsZwuQyI0BZRBloyIDjTnYisWPajrgqV/ku4= -github.com/loops-so/loops-go v0.6.0/go.mod h1:BDzBhAn/4e2QSKXrpXufIpSuH8xUPv9oa+hazH01ejE= +github.com/loops-so/loops-go v0.6.1 h1:pf0BklgdtLRC4x5ra4SrKrwEP/a3aLVUVNKJbboPZzk= +github.com/loops-so/loops-go v0.6.1/go.mod h1:BDzBhAn/4e2QSKXrpXufIpSuH8xUPv9oa+hazH01ejE= github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w=