Files
Steve Cliff b07572fed5 Released v1
2026-02-12 10:37:19 +00:00

381 lines
12 KiB
Bash
Executable File

#!/usr/bin/env bash
set -uo pipefail
PCLI="./pcli"
PASS=0
FAIL=0
SKIP=0
ERRORS=""
# Resource IDs for cleanup
CARD_ID=""
DUP_CARD_ID=""
COMMENT_ID=""
TL_ID=""
TASK_ID=""
TASK_ID2=""
LABEL_ID=""
green() { printf "\033[32m%s\033[0m\n" "$1"; }
red() { printf "\033[31m%s\033[0m\n" "$1"; }
yellow() { printf "\033[33m%s\033[0m\n" "$1"; }
run_test() {
local desc="$1"
shift
local output
if output=$("$@" 2>&1); then
PASS=$((PASS + 1))
green "$desc"
echo "$output"
else
FAIL=$((FAIL + 1))
red "$desc"
ERRORS="${ERRORS}\n - ${desc}"
echo "$output"
fi
}
run_test_optional() {
local desc="$1"
shift
local output
if output=$("$@" 2>&1); then
PASS=$((PASS + 1))
green "$desc"
echo "$output"
else
SKIP=$((SKIP + 1))
yellow "$desc (skipped — may not be supported)"
fi
}
extract_id() {
echo "$1" | jq -r '.data.id // empty'
}
cleanup() {
echo ""
echo "--- Cleanup ---"
[ -n "$TASK_ID2" ] && { $PCLI task delete "$TASK_ID2" >/dev/null 2>&1 && green " ✓ deleted task $TASK_ID2" || yellow " ⚠ could not delete task $TASK_ID2"; }
[ -n "$TASK_ID" ] && { $PCLI task delete "$TASK_ID" >/dev/null 2>&1 && green " ✓ deleted task $TASK_ID" || yellow " ⚠ could not delete task $TASK_ID"; }
[ -n "$TL_ID" ] && { $PCLI task-list delete "$TL_ID" >/dev/null 2>&1 && green " ✓ deleted task-list $TL_ID" || yellow " ⚠ could not delete task-list $TL_ID"; }
[ -n "$COMMENT_ID" ] && { $PCLI comment delete "$COMMENT_ID" >/dev/null 2>&1 && green " ✓ deleted comment $COMMENT_ID" || yellow " ⚠ could not delete comment $COMMENT_ID"; }
[ -n "$LABEL_ID" ] && { $PCLI label delete "$LABEL_ID" >/dev/null 2>&1 && green " ✓ deleted label $LABEL_ID" || yellow " ⚠ could not delete label $LABEL_ID"; }
[ -n "$DUP_CARD_ID" ] && { $PCLI card delete "$DUP_CARD_ID" >/dev/null 2>&1 && green " ✓ deleted card $DUP_CARD_ID (dup)" || yellow " ⚠ could not delete card $DUP_CARD_ID"; }
[ -n "$CARD_ID" ] && { $PCLI card delete "$CARD_ID" >/dev/null 2>&1 && green " ✓ deleted card $CARD_ID" || yellow " ⚠ could not delete card $CARD_ID"; }
}
trap cleanup EXIT
echo "============================================"
echo " pcli Integration Test Suite"
echo "============================================"
echo ""
# Check prerequisites
if [ -z "${PLANKA_URL:-}" ]; then
red "PLANKA_URL is not set"
exit 1
fi
if [ -z "${PLANKA_API_KEY:-}" ]; then
red "PLANKA_API_KEY is not set"
exit 1
fi
echo "Using PLANKA_URL: $PLANKA_URL"
echo ""
# Build
echo "--- Building pcli ---"
if go build -o pcli; then
PASS=$((PASS + 1))
green " ✓ Build successful"
else
red " ✗ Build failed"
exit 1
fi
echo ""
# ==========================================
# 1. Help & Error Handling
# ==========================================
echo "--- 1. Help & Error Handling ---"
run_test "pcli --help" $PCLI --help
echo ""
run_test "pcli project --help" $PCLI project --help
echo ""
run_test "pcli board --help" $PCLI board --help
echo ""
run_test "pcli card --help" $PCLI card --help
echo ""
# Test missing env vars
echo " Testing missing PLANKA_URL error..."
ERR_OUTPUT=$(PLANKA_URL="" PLANKA_API_KEY="" $PCLI project list 2>&1) || true
if echo "$ERR_OUTPUT" | grep -q "PLANKA_URL"; then
PASS=$((PASS + 1))
green " ✓ Missing PLANKA_URL produces error"
else
FAIL=$((FAIL + 1))
red " ✗ Missing PLANKA_URL error not detected"
ERRORS="${ERRORS}\n - Missing PLANKA_URL error"
fi
echo ""
# ==========================================
# 2. Project Commands
# ==========================================
echo "--- 2. Project Commands ---"
PROJECT_LIST=$($PCLI project list) || { red " ✗ project list failed"; exit 1; }
run_test "project list" echo "$PROJECT_LIST"
echo ""
PROJECT_ID=$(echo "$PROJECT_LIST" | jq -r '.data[0].id')
echo " Using project ID: $PROJECT_ID"
run_test "project get $PROJECT_ID" $PCLI project get "$PROJECT_ID"
echo ""
run_test "project list --format=table" $PCLI --format=table project list
echo ""
# ==========================================
# 3. Board Commands
# ==========================================
echo "--- 3. Board Commands ---"
BOARD_LIST=$($PCLI board list) || { red " ✗ board list failed"; exit 1; }
run_test "board list" echo "$BOARD_LIST"
echo ""
BOARD_ID=$(echo "$BOARD_LIST" | jq -r '.data[0].id')
echo " Using board ID: $BOARD_ID"
BOARD_GET=$($PCLI board get "$BOARD_ID") || { red " ✗ board get failed"; exit 1; }
run_test "board get $BOARD_ID" echo "$BOARD_GET"
echo ""
run_test_optional "board actions $BOARD_ID --limit 5" $PCLI board actions "$BOARD_ID" --limit 5
echo ""
run_test "board list --format=table" $PCLI --format=table board list
echo ""
# ==========================================
# 3b. Status Command
# ==========================================
echo "--- 3b. Status Command ---"
run_test "status (json)" $PCLI status
echo ""
run_test "status (table)" $PCLI --format=table status
echo ""
# ==========================================
# 4. Card CRUD
# ==========================================
echo "--- 4. Card CRUD ---"
# Get a list ID from the board
LIST_ID=$(echo "$BOARD_GET" | jq -r '.data.lists[0].id // empty')
if [ -z "$LIST_ID" ]; then
red " ✗ No lists found on board $BOARD_ID"
exit 1
fi
echo " Using list ID: $LIST_ID"
# Create a card
CARD_CREATE=$($PCLI card create --list "$LIST_ID" --name "Test Card from pcli" --description "Created by test script")
run_test "card create" echo "$CARD_CREATE"
CARD_ID=$(extract_id "$CARD_CREATE")
echo " Created card ID: $CARD_ID"
echo ""
if [ -z "$CARD_ID" ]; then
red " ✗ Card creation failed, cannot continue card tests"
else
# Get the card
run_test "card get $CARD_ID" $PCLI card get "$CARD_ID"
echo ""
# Update the card
CARD_UPDATE=$($PCLI card update "$CARD_ID" --name "Test Card Updated" --description "Updated by test script")
run_test "card update $CARD_ID" echo "$CARD_UPDATE"
echo ""
# List cards by list (may not work on older Planka versions)
run_test_optional "card list --list $LIST_ID" $PCLI card list --list "$LIST_ID"
echo ""
# List cards by board
run_test "card list --board $BOARD_ID" $PCLI card list --board "$BOARD_ID"
echo ""
# List cards by board with limit
run_test "card list --board $BOARD_ID --limit 2" $PCLI card list --board "$BOARD_ID" --limit 2
echo ""
# Card actions (optional)
run_test_optional "card actions $CARD_ID --limit 5" $PCLI card actions "$CARD_ID" --limit 5
echo ""
# Duplicate the card
CARD_DUP=$($PCLI card duplicate "$CARD_ID" --name "Duplicated Test Card")
run_test "card duplicate $CARD_ID" echo "$CARD_DUP"
DUP_CARD_ID=$(extract_id "$CARD_DUP")
echo " Duplicated card ID: $DUP_CARD_ID"
echo ""
# Move test
SECOND_LIST_ID=$(echo "$BOARD_GET" | jq -r '.data.lists[1].id // empty')
if [ -n "$SECOND_LIST_ID" ]; then
CARD_MOVE=$($PCLI card move "$CARD_ID" --list "$SECOND_LIST_ID")
run_test "card move $CARD_ID --list $SECOND_LIST_ID" echo "$CARD_MOVE"
echo ""
else
yellow " ⚠ Skipping card move test — only one list on board"
echo ""
fi
# Table format
run_test "card list --board $BOARD_ID --format=table" $PCLI --format=table card list --board "$BOARD_ID"
echo ""
# ==========================================
# 5. Comment CRUD (optional — may 404 on some Planka versions)
# ==========================================
echo "--- 5. Comment CRUD ---"
COMMENT_CREATE=$($PCLI comment create --card "$CARD_ID" --text "Test comment from pcli" 2>&1) || true
CMT_ID=$(echo "$COMMENT_CREATE" | jq -r '.data.id // empty' 2>/dev/null)
if [ -n "$CMT_ID" ]; then
COMMENT_ID="$CMT_ID"
PASS=$((PASS + 1))
green " ✓ comment create"
echo "$COMMENT_CREATE"
echo " Created comment ID: $COMMENT_ID"
echo ""
run_test_optional "comment list --card $CARD_ID" $PCLI comment list --card "$CARD_ID"
echo ""
run_test "comment update $COMMENT_ID" $PCLI comment update "$COMMENT_ID" --text "Updated test comment"
echo ""
else
SKIP=$((SKIP + 1))
yellow " ⚠ comment create not supported on this Planka instance (skipped)"
echo ""
fi
# ==========================================
# 6. Task List CRUD (optional — may not exist on older Planka)
# ==========================================
echo "--- 6. Task List CRUD ---"
TL_CREATE=$($PCLI task-list create --card "$CARD_ID" --name "Test Checklist" 2>&1) || true
TL_ID_VAL=$(echo "$TL_CREATE" | jq -r '.data.id // empty' 2>/dev/null)
if [ -n "$TL_ID_VAL" ]; then
TL_ID="$TL_ID_VAL"
PASS=$((PASS + 1))
green " ✓ task-list create"
echo " Created task list ID: $TL_ID"
echo ""
run_test "task-list get $TL_ID" $PCLI task-list get "$TL_ID"
echo ""
TL_UPDATE=$($PCLI task-list update "$TL_ID" --name "Updated Checklist")
run_test "task-list update $TL_ID" echo "$TL_UPDATE"
echo ""
# ==========================================
# 7. Task CRUD
# ==========================================
echo "--- 7. Task CRUD ---"
TASK_CREATE=$($PCLI task create --task-list "$TL_ID" --name "Test Task 1")
run_test "task create" echo "$TASK_CREATE"
TASK_ID=$(extract_id "$TASK_CREATE")
echo " Created task ID: $TASK_ID"
echo ""
if [ -n "$TASK_ID" ]; then
TASK_UPDATE=$($PCLI task update "$TASK_ID" --completed)
run_test "task update $TASK_ID --completed" echo "$TASK_UPDATE"
echo ""
fi
TASK_CREATE2=$($PCLI task create --task-list "$TL_ID" --name "Test Task 2")
run_test "task create (second)" echo "$TASK_CREATE2"
TASK_ID2=$(extract_id "$TASK_CREATE2")
echo ""
else
SKIP=$((SKIP + 1))
yellow " ⚠ task-list create not supported on this Planka instance (skipped)"
echo ""
fi
# ==========================================
# 8. Label CRUD
# ==========================================
echo "--- 8. Label CRUD ---"
LABEL_CREATE=$($PCLI label create --board "$BOARD_ID" --name "test-label" --color "berry-red")
run_test "label create" echo "$LABEL_CREATE"
LABEL_ID=$(extract_id "$LABEL_CREATE")
echo " Created label ID: $LABEL_ID"
echo ""
if [ -n "$LABEL_ID" ]; then
LABEL_UPDATE=$($PCLI label update "$LABEL_ID" --name "updated-label" --color "lagoon-blue")
run_test "label update $LABEL_ID" echo "$LABEL_UPDATE"
echo ""
# ==========================================
# 9. Card Label Operations
# ==========================================
echo "--- 9. Card Label Operations ---"
run_test "card add-label $CARD_ID --label $LABEL_ID" $PCLI card add-label "$CARD_ID" --label "$LABEL_ID"
echo ""
run_test "card remove-label $CARD_ID --label $LABEL_ID" $PCLI card remove-label "$CARD_ID" --label "$LABEL_ID"
echo ""
fi
fi
# Cleanup runs via EXIT trap
# ==========================================
# Summary
# ==========================================
echo ""
echo "============================================"
echo " Test Summary"
echo "============================================"
green " Passed: $PASS"
if [ "$SKIP" -gt 0 ]; then
yellow " Skipped: $SKIP"
fi
if [ "$FAIL" -gt 0 ]; then
red " Failed: $FAIL"
echo ""
red " Failed tests:"
echo -e "$ERRORS"
else
green " Failed: 0"
fi
echo ""
TOTAL=$((PASS + FAIL))
echo " Total: $TOTAL (plus $SKIP skipped)"
echo "============================================"
exit "$FAIL"