#!/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"