Files
ecto/cmd/newsletters_test.go

155 lines
3.7 KiB
Go

package cmd
import (
"encoding/json"
"net/http"
"net/http/httptest"
"os"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestNewslettersCmd(t *testing.T) {
_, cleanup := mockGhostServer(t)
defer cleanup()
tests := []struct {
name string
args []string
wantOut []string
wantErr bool
}{
{
name: "list newsletters default",
args: []string{"newsletters"},
wantOut: []string{"nl-1", "Newsletter One", "newsletter-one", "[active]"},
wantErr: false,
},
{
name: "list newsletters with json",
args: []string{"newsletters", "--json"},
wantOut: []string{`"newsletters"`, `"id"`, `"name"`},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
cmd := newTestRootCmd()
stdout, _, err := executeCommand(cmd, tt.args...)
if tt.wantErr {
require.Error(t, err)
return
}
require.NoError(t, err)
for _, want := range tt.wantOut {
assert.Contains(t, stdout, want)
}
})
}
}
func TestNewsletterCmd(t *testing.T) {
_, cleanup := mockGhostServer(t)
defer cleanup()
tests := []struct {
name string
args []string
wantOut []string
wantErr bool
}{
{
name: "get newsletter by id",
args: []string{"newsletter", "newsletter-123"},
wantOut: []string{"ID:", "newsletter-123", "Name:", "Test Newsletter", "Slug:", "test-newsletter", "Status:", "active", "Description:", "A test newsletter"},
wantErr: false,
},
{
name: "get newsletter with json",
args: []string{"newsletter", "newsletter-123", "--json"},
wantOut: []string{`"newsletters"`, `"id"`, `"newsletter-123"`},
wantErr: false,
},
{
name: "get newsletter missing arg",
args: []string{"newsletter"},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
cmd := newTestRootCmd()
stdout, _, err := executeCommand(cmd, tt.args...)
if tt.wantErr {
require.Error(t, err)
return
}
require.NoError(t, err)
for _, want := range tt.wantOut {
assert.Contains(t, stdout, want)
}
})
}
}
func TestNewslettersEmptyResponse(t *testing.T) {
// Create a custom server that returns empty newsletters
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]interface{}{
"newsletters": []interface{}{},
})
})
server := httptest.NewServer(handler)
defer server.Close()
origURL := os.Getenv("GHOST_URL")
origKey := os.Getenv("GHOST_ADMIN_KEY")
os.Setenv("GHOST_URL", server.URL)
os.Setenv("GHOST_ADMIN_KEY", "testid:0123456789abcdef0123456789abcdef")
defer func() {
os.Setenv("GHOST_URL", origURL)
os.Setenv("GHOST_ADMIN_KEY", origKey)
}()
cmd := newTestRootCmd()
stdout, _, err := executeCommand(cmd, "newsletters")
require.NoError(t, err)
assert.Contains(t, stdout, "No newsletters found")
}
func TestNewslettersApiError(t *testing.T) {
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(w).Encode(map[string]interface{}{
"errors": []map[string]string{{"message": "Internal server error"}},
})
})
server := httptest.NewServer(handler)
defer server.Close()
origURL := os.Getenv("GHOST_URL")
origKey := os.Getenv("GHOST_ADMIN_KEY")
os.Setenv("GHOST_URL", server.URL)
os.Setenv("GHOST_ADMIN_KEY", "testid:0123456789abcdef0123456789abcdef")
defer func() {
os.Setenv("GHOST_URL", origURL)
os.Setenv("GHOST_ADMIN_KEY", origKey)
}()
cmd := newTestRootCmd()
_, _, err := executeCommand(cmd, "newsletters")
require.Error(t, err)
}