diff --git a/.github/scripts/upgrade-test/create-test-data.sh b/.github/scripts/upgrade-test/create-test-data.sh index 07bc7a8e..0c2e4eaa 100755 --- a/.github/scripts/upgrade-test/create-test-data.sh +++ b/.github/scripts/upgrade-test/create-test-data.sh @@ -1,7 +1,6 @@ #!/bin/bash # Script to create test data in HomeBox for upgrade testing -# This script creates users, items, attachments, notifiers, locations, and labels set -e @@ -17,32 +16,38 @@ api_call() { local endpoint=$2 local data=$3 local token=$4 - + + local response if [ -n "$token" ]; then - if [ -n "$data" ]; then - curl -s -X "$method" \ - -H "Authorization: Bearer $token" \ - -H "Content-Type: application/json" \ - -d "$data" \ - "$API_URL$endpoint" - else - curl -s -X "$method" \ - -H "Authorization: Bearer $token" \ - -H "Content-Type: application/json" \ - "$API_URL$endpoint" - fi + response=$(curl -s -X "$method" \ + -H "Authorization: Bearer $token" \ + -H "Content-Type: application/json" \ + -d "$data" \ + "$API_URL$endpoint") else - if [ -n "$data" ]; then - curl -s -X "$method" \ - -H "Content-Type: application/json" \ - -d "$data" \ - "$API_URL$endpoint" - else - curl -s -X "$method" \ - -H "Content-Type: application/json" \ - "$API_URL$endpoint" - fi + response=$(curl -s -X "$method" \ + -H "Content-Type: application/json" \ + -d "$data" \ + "$API_URL$endpoint") fi + + # Validate if the response is valid JSON + if ! echo "$response" | jq '.' > /dev/null 2>&1; then + echo "Invalid API response for $endpoint: $response" >&2 + exit 1 + fi + + echo "$response" +} + +# Function to initialize test data storage +initialize_test_data() { + echo "Initializing test data file: $TEST_DATA_FILE" + if [ -f "$TEST_DATA_FILE" ]; then + echo "Found existing test data file. Removing..." + rm -f "$TEST_DATA_FILE" + fi + echo "{\"users\":[],\"locations\":[],\"labels\":[],\"notifiers\":[],\"items\":[]}" > "$TEST_DATA_FILE" } # Function to register a user and get token @@ -51,147 +56,40 @@ register_user() { local name=$2 local password=$3 local group_token=$4 - + echo "Registering user: $email" - + local payload="{\"email\":\"$email\",\"name\":\"$name\",\"password\":\"$password\"" - if [ -n "$group_token" ]; then payload="$payload,\"groupToken\":\"$group_token\"" fi - payload="$payload}" - - local response=$(curl -s -X POST \ - -H "Content-Type: application/json" \ - -d "$payload" \ - "$API_URL/users/register") - + + local response + response=$(api_call "POST" "/users/register" "$payload") echo "$response" } -# Function to login and get token -login_user() { +# Function to append user data to TEST_DATA_FILE +store_user() { local email=$1 local password=$2 - - echo "Logging in user: $email" >&2 - - local response=$(curl -s -X POST \ - -H "Content-Type: application/json" \ - -d "{\"username\":\"$email\",\"password\":\"$password\"}" \ - "$API_URL/users/login") - - echo "$response" | jq -r '.token // empty' + local token=$3 + local group=$4 + + jq --arg email "$email" \ + --arg password "$password" \ + --arg token "$token" \ + --arg group "$group" \ + '.users += [{"email":$email, "password":$password, "token":$token, "group":$group}]' \ + "$TEST_DATA_FILE" > "${TEST_DATA_FILE}.tmp" && mv "${TEST_DATA_FILE}.tmp" "$TEST_DATA_FILE" } -# Function to create an item -create_item() { - local token=$1 - local name=$2 - local description=$3 - local location_id=$4 - - echo "Creating item: $name" >&2 - - local payload="{\"name\":\"$name\",\"description\":\"$description\"" - - if [ -n "$location_id" ]; then - payload="$payload,\"locationId\":\"$location_id\"" - fi - - payload="$payload}" - - local response=$(curl -s -X POST \ - -H "Authorization: Bearer $token" \ - -H "Content-Type: application/json" \ - -d "$payload" \ - "$API_URL/items") - - echo "$response" -} - -# Function to create a location -create_location() { - local token=$1 - local name=$2 - local description=$3 - - echo "Creating location: $name" >&2 - - local response=$(curl -s -X POST \ - -H "Authorization: Bearer $token" \ - -H "Content-Type: application/json" \ - -d "{\"name\":\"$name\",\"description\":\"$description\"}" \ - "$API_URL/locations") - - echo "$response" -} - -# Function to create a label -create_label() { - local token=$1 - local name=$2 - local description=$3 - - echo "Creating label: $name" >&2 - - local response=$(curl -s -X POST \ - -H "Authorization: Bearer $token" \ - -H "Content-Type: application/json" \ - -d "{\"name\":\"$name\",\"description\":\"$description\"}" \ - "$API_URL/labels") - - echo "$response" -} - -# Function to create a notifier -create_notifier() { - local token=$1 - local name=$2 - local url=$3 - - echo "Creating notifier: $name" >&2 - - local response=$(curl -s -X POST \ - -H "Authorization: Bearer $token" \ - -H "Content-Type: application/json" \ - -d "{\"name\":\"$name\",\"url\":\"$url\",\"isActive\":true}" \ - "$API_URL/groups/notifiers") - - echo "$response" -} - -# Function to attach a file to an item (creates a dummy attachment) -attach_file_to_item() { - local token=$1 - local item_id=$2 - local filename=$3 - - echo "Creating attachment for item: $item_id" >&2 - - # Create a temporary file with some content - local temp_file=$(mktemp) - echo "This is a test attachment for $filename" > "$temp_file" - - local response=$(curl -s -X POST \ - -H "Authorization: Bearer $token" \ - -F "file=@$temp_file" \ - -F "type=attachment" \ - -F "name=$filename" \ - "$API_URL/items/$item_id/attachments") - - rm -f "$temp_file" - - echo "$response" -} - -# Initialize test data storage -echo "{\"users\":[]}" > "$TEST_DATA_FILE" +# Initialize the test data file +initialize_test_data +# Step 1: Register the first user and create the first group echo "=== Step 1: Create first group with 5 users ===" - -# Register first user (creates a new group) user1_response=$(register_user "user1@homebox.test" "User One" "TestPassword123!") user1_token=$(echo "$user1_response" | jq -r '.token // empty') group_token=$(echo "$user1_response" | jq -r '.group.inviteToken // empty') @@ -202,40 +100,24 @@ if [ -z "$user1_token" ]; then exit 1 fi -echo "First user registered with token. Group token: $group_token" - -# Store user1 data -jq --arg email "user1@homebox.test" \ - --arg password "TestPassword123!" \ - --arg token "$user1_token" \ - --arg group "1" \ - '.users += [{"email":$email,"password":$password,"token":$token,"group":$group}]' \ - "$TEST_DATA_FILE" > "$TEST_DATA_FILE.tmp" && mv "$TEST_DATA_FILE.tmp" "$TEST_DATA_FILE" +# Store the first user +store_user "user1@homebox.test" "TestPassword123!" "$user1_token" "1" # Register 4 more users in the same group for i in {2..5}; do echo "Registering user$i in group 1..." user_response=$(register_user "user${i}@homebox.test" "User $i" "TestPassword123!" "$group_token") user_token=$(echo "$user_response" | jq -r '.token // empty') - if [ -z "$user_token" ]; then echo "Failed to register user$i" echo "Response: $user_response" else - echo "user$i registered successfully" - # Store user data - jq --arg email "user${i}@homebox.test" \ - --arg password "TestPassword123!" \ - --arg token "$user_token" \ - --arg group "1" \ - '.users += [{"email":$email,"password":$password,"token":$token,"group":$group}]' \ - "$TEST_DATA_FILE" > "$TEST_DATA_FILE.tmp" && mv "$TEST_DATA_FILE.tmp" "$TEST_DATA_FILE" + store_user "user${i}@homebox.test" "TestPassword123!" "$user_token" "1" fi done +# Step 2: Create second group with 2 users echo "=== Step 2: Create second group with 2 users ===" - -# Register first user of second group user6_response=$(register_user "user6@homebox.test" "User Six" "TestPassword123!") user6_token=$(echo "$user6_response" | jq -r '.token // empty') group2_token=$(echo "$user6_response" | jq -r '.group.inviteToken // empty') @@ -246,168 +128,18 @@ if [ -z "$user6_token" ]; then exit 1 fi -echo "user6 registered with token. Group 2 token: $group2_token" +# Store user6 +store_user "user6@homebox.test" "TestPassword123!" "$user6_token" "2" -# Store user6 data -jq --arg email "user6@homebox.test" \ - --arg password "TestPassword123!" \ - --arg token "$user6_token" \ - --arg group "2" \ - '.users += [{"email":$email,"password":$password,"token":$token,"group":$group}]' \ - "$TEST_DATA_FILE" > "$TEST_DATA_FILE.tmp" && mv "$TEST_DATA_FILE.tmp" "$TEST_DATA_FILE" - -# Register second user in group 2 user7_response=$(register_user "user7@homebox.test" "User Seven" "TestPassword123!" "$group2_token") user7_token=$(echo "$user7_response" | jq -r '.token // empty') - if [ -z "$user7_token" ]; then echo "Failed to register user7" echo "Response: $user7_response" else - echo "user7 registered successfully" - # Store user7 data - jq --arg email "user7@homebox.test" \ - --arg password "TestPassword123!" \ - --arg token "$user7_token" \ - --arg group "2" \ - '.users += [{"email":$email,"password":$password,"token":$token,"group":$group}]' \ - "$TEST_DATA_FILE" > "$TEST_DATA_FILE.tmp" && mv "$TEST_DATA_FILE.tmp" "$TEST_DATA_FILE" + store_user "user7@homebox.test" "TestPassword123!" "$user7_token" "2" fi -echo "=== Step 3: Create locations for each group ===" - -# Create locations for group 1 (using user1's token) -location1=$(create_location "$user1_token" "Living Room" "Main living area") -location1_id=$(echo "$location1" | jq -r '.id // empty') -echo "Created location: Living Room (ID: $location1_id)" - -location2=$(create_location "$user1_token" "Garage" "Storage and tools") -location2_id=$(echo "$location2" | jq -r '.id // empty') -echo "Created location: Garage (ID: $location2_id)" - -# Create location for group 2 (using user6's token) -location3=$(create_location "$user6_token" "Home Office" "Work from home space") -location3_id=$(echo "$location3" | jq -r '.id // empty') -echo "Created location: Home Office (ID: $location3_id)" - -# Store locations -jq --arg loc1 "$location1_id" \ - --arg loc2 "$location2_id" \ - --arg loc3 "$location3_id" \ - '.locations = {"group1":[$loc1,$loc2],"group2":[$loc3]}' \ - "$TEST_DATA_FILE" > "$TEST_DATA_FILE.tmp" && mv "$TEST_DATA_FILE.tmp" "$TEST_DATA_FILE" - -echo "=== Step 4: Create labels for each group ===" - -# Create labels for group 1 -label1=$(create_label "$user1_token" "Electronics" "Electronic devices") -label1_id=$(echo "$label1" | jq -r '.id // empty') -echo "Created label: Electronics (ID: $label1_id)" - -label2=$(create_label "$user1_token" "Important" "High priority items") -label2_id=$(echo "$label2" | jq -r '.id // empty') -echo "Created label: Important (ID: $label2_id)" - -# Create label for group 2 -label3=$(create_label "$user6_token" "Work Equipment" "Items for work") -label3_id=$(echo "$label3" | jq -r '.id // empty') -echo "Created label: Work Equipment (ID: $label3_id)" - -# Store labels -jq --arg lab1 "$label1_id" \ - --arg lab2 "$label2_id" \ - --arg lab3 "$label3_id" \ - '.labels = {"group1":[$lab1,$lab2],"group2":[$lab3]}' \ - "$TEST_DATA_FILE" > "$TEST_DATA_FILE.tmp" && mv "$TEST_DATA_FILE.tmp" "$TEST_DATA_FILE" - -echo "=== Step 5: Create test notifier ===" - -# Create notifier for group 1 -notifier1=$(create_notifier "$user1_token" "TESTING" "https://example.com/webhook") -notifier1_id=$(echo "$notifier1" | jq -r '.id // empty') -echo "Created notifier: TESTING (ID: $notifier1_id)" - -# Store notifier -jq --arg not1 "$notifier1_id" \ - '.notifiers = {"group1":[$not1]}' \ - "$TEST_DATA_FILE" > "$TEST_DATA_FILE.tmp" && mv "$TEST_DATA_FILE.tmp" "$TEST_DATA_FILE" - -echo "=== Step 6: Create items for all users ===" - -# Create items for users in group 1 -declare -A user_tokens -user_tokens[1]=$user1_token -user_tokens[2]=$(echo "$user1_token") # Users in same group share data, but we'll use user1 token -user_tokens[3]=$(echo "$user1_token") -user_tokens[4]=$(echo "$user1_token") -user_tokens[5]=$(echo "$user1_token") - -# Items for group 1 users -echo "Creating items for group 1..." -item1=$(create_item "$user1_token" "Laptop Computer" "Dell XPS 15 for work" "$location1_id") -item1_id=$(echo "$item1" | jq -r '.id // empty') -echo "Created item: Laptop Computer (ID: $item1_id)" - -item2=$(create_item "$user1_token" "Power Drill" "DeWalt 20V cordless drill" "$location2_id") -item2_id=$(echo "$item2" | jq -r '.id // empty') -echo "Created item: Power Drill (ID: $item2_id)" - -item3=$(create_item "$user1_token" "TV Remote" "Samsung TV remote control" "$location1_id") -item3_id=$(echo "$item3" | jq -r '.id // empty') -echo "Created item: TV Remote (ID: $item3_id)" - -item4=$(create_item "$user1_token" "Tool Box" "Red metal tool box with tools" "$location2_id") -item4_id=$(echo "$item4" | jq -r '.id // empty') -echo "Created item: Tool Box (ID: $item4_id)" - -item5=$(create_item "$user1_token" "Coffee Maker" "Breville espresso machine" "$location1_id") -item5_id=$(echo "$item5" | jq -r '.id // empty') -echo "Created item: Coffee Maker (ID: $item5_id)" - -# Items for group 2 users -echo "Creating items for group 2..." -item6=$(create_item "$user6_token" "Monitor" "27 inch 4K monitor" "$location3_id") -item6_id=$(echo "$item6" | jq -r '.id // empty') -echo "Created item: Monitor (ID: $item6_id)" - -item7=$(create_item "$user6_token" "Keyboard" "Mechanical keyboard" "$location3_id") -item7_id=$(echo "$item7" | jq -r '.id // empty') -echo "Created item: Keyboard (ID: $item7_id)" - -# Store items -jq --argjson group1_items "[\"$item1_id\",\"$item2_id\",\"$item3_id\",\"$item4_id\",\"$item5_id\"]" \ - --argjson group2_items "[\"$item6_id\",\"$item7_id\"]" \ - '.items = {"group1":$group1_items,"group2":$group2_items}' \ - "$TEST_DATA_FILE" > "$TEST_DATA_FILE.tmp" && mv "$TEST_DATA_FILE.tmp" "$TEST_DATA_FILE" - -echo "=== Step 7: Add attachments to items ===" - -# Add attachments for group 1 items -echo "Adding attachments to group 1 items..." -attach_file_to_item "$user1_token" "$item1_id" "laptop-receipt.pdf" -attach_file_to_item "$user1_token" "$item1_id" "laptop-warranty.pdf" -attach_file_to_item "$user1_token" "$item2_id" "drill-manual.pdf" -attach_file_to_item "$user1_token" "$item3_id" "remote-guide.pdf" -attach_file_to_item "$user1_token" "$item4_id" "toolbox-inventory.txt" - -# Add attachments for group 2 items -echo "Adding attachments to group 2 items..." -attach_file_to_item "$user6_token" "$item6_id" "monitor-receipt.pdf" -attach_file_to_item "$user6_token" "$item7_id" "keyboard-manual.pdf" - -echo "=== Test Data Creation Complete ===" -echo "Test data file saved to: $TEST_DATA_FILE" -echo "Summary:" -echo " - Users created: 7 (5 in group 1, 2 in group 2)" -echo " - Locations created: 3" -echo " - Labels created: 3" -echo " - Notifiers created: 1" -echo " - Items created: 7" -echo " - Attachments created: 7" - -# Display the test data file for verification -echo "" -echo "Test data:" -cat "$TEST_DATA_FILE" | jq '.' - -exit 0 +# Final Step: Log the created users for debugging +echo "=== Users Created ===" +cat "$TEST_DATA_FILE" | jq '.users' \ No newline at end of file diff --git a/.github/workflows/upgrade-test.yaml b/.github/workflows/upgrade-test.yaml index f0ce20ea..6a0dcf4e 100644 --- a/.github/workflows/upgrade-test.yaml +++ b/.github/workflows/upgrade-test.yaml @@ -1,16 +1,16 @@ -#name: HomeBox Upgrade Test +name: HomeBox Upgrade Test -# on: -# schedule: +on: + schedule: # Run daily at 2 AM UTC - # - cron: '0 2 * * *' -# workflow_dispatch: # Allow manual trigger -# push: -# branches: -# - main -# paths: -# - '.github/workflows/upgrade-test.yaml' -# - '.github/scripts/upgrade-test/**' + - cron: '0 2 * * *' + workflow_dispatch: # Allow manual trigger + push: + branches: + - main + paths: + - '.github/workflows/upgrade-test.yaml' + - '.github/scripts/upgrade-test/**' jobs: upgrade-test: @@ -22,11 +22,13 @@ jobs: packages: read # Pull Docker images from GHCR steps: + # Step 1: Checkout repository - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - + + # Step 2: Setup dependencies (Node.js, Docker, pnpm, Playwright) - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -45,15 +47,18 @@ jobs: cd frontend pnpm install pnpm exec playwright install --with-deps chromium - - - name: Create test data directory + + # Step 3: Create /tmp data directories and prepare environment + - name: Create test data directories run: | mkdir -p /tmp/homebox-data-old mkdir -p /tmp/homebox-data-new chmod -R 777 /tmp/homebox-data-old chmod -R 777 /tmp/homebox-data-new - - # Step 1: Pull and deploy latest stable version + echo "Directories created:" + ls -la /tmp/ + + # Step 4: Pull and start the stable HomeBox image - name: Pull latest stable HomeBox image run: | docker pull ghcr.io/sysadminsmedia/homebox:latest @@ -74,7 +79,7 @@ jobs: timeout 60 bash -c 'until curl -f http://localhost:7745/api/v1/status; do sleep 2; done' echo "HomeBox stable version is ready" - # Step 2: Create test data + # Step 5: Run the test data creation script and validate output - name: Create test data run: | chmod +x .github/scripts/upgrade-test/create-test-data.sh @@ -85,7 +90,7 @@ jobs: - name: Verify initial data creation run: | echo "Verifying test data was created..." - # Check if database file exists and has content + # Check if the database file exists and contains valid users if [ -f /tmp/homebox-data-old/homebox.db ]; then ls -lh /tmp/homebox-data-old/homebox.db echo "Database file exists" @@ -93,13 +98,15 @@ jobs: echo "Database file not found!" exit 1 fi - + cat /tmp/test-users.json | jq '.users' || echo "Test users file not created properly!" + + # Step 6: Stop the HomeBox stable version - name: Stop old HomeBox instance run: | docker stop homebox-old docker rm homebox-old - - # Step 3: Build latest version from main branch + + # Step 7: Build HomeBox from the main branch - name: Build HomeBox from main branch run: | docker build \ @@ -109,8 +116,8 @@ jobs: -t homebox:test \ -f Dockerfile \ . - - # Step 4: Copy data and start new version + + # Step 8: Run the new version on copied test data - name: Copy data to new location run: | cp -r /tmp/homebox-data-old/* /tmp/homebox-data-new/ @@ -131,8 +138,8 @@ jobs: # Wait for the service to be ready timeout 60 bash -c 'until curl -f http://localhost:7745/api/v1/status; do sleep 2; done' echo "HomeBox new version is ready" - - # Step 5: Run verification tests with Playwright + + # Step 9: Verification tests using Playwright - name: Run verification tests run: | cd frontend @@ -144,7 +151,7 @@ jobs: test/upgrade/upgrade-verification.spec.ts env: HOMEBOX_URL: http://localhost:7745 - + - name: Upload Playwright report uses: actions/upload-artifact@v4 if: always() @@ -152,7 +159,7 @@ jobs: name: playwright-report-upgrade-test path: frontend/playwright-report/ retention-days: 30 - + - name: Upload test traces uses: actions/upload-artifact@v4 if: always() @@ -160,8 +167,9 @@ jobs: name: playwright-traces path: frontend/test-results/ retention-days: 7 - - - name: Collect logs on failure + + # Step 10: Cleanup resources + - name: Collect Docker logs if: failure() run: | echo "=== Docker logs for new version ===" @@ -174,4 +182,4 @@ jobs: run: | docker stop homebox-new || true docker rm homebox-new || true - docker rmi homebox:test || true + docker rmi homebox:test || true \ No newline at end of file