# Verification Steps for sync-git-project.sh This document outlines testing steps and edge cases for verifying the enhanced `sync-git-project.sh` script. ## Prerequisites Before testing, ensure you have: - A test server with SSH access - A git repository on the server - `sshpass` installed locally - Docker installed and running - `make` available ## Test Cases ### 1. Clone Test **Purpose:** Verify git clone works with credentials **Steps:** 1. Run `./sync-project.sh --git` 2. Provide valid server credentials 3. Verify repository is cloned to LOCAL_FOLDER **Expected:** Repository cloned successfully, cd into project works **Edge cases:** - Wrong SSH credentials → Should show error and exit - Repository doesn't exist → Should show clear error message - LOCAL_FOLDER already exists → Git will fail with appropriate error --- ### 2. .npmrc Check **Purpose:** Test with/without .npmrc file **Steps:** 1. Clone a project without .npmrc 2. Verify script pauses and prompts user 3. Add .npmrc file 4. Press Enter to continue **Expected:** Script pauses with clear message, continues after file added --- ### 3. Docker Env Copy **Purpose:** Verify .docker/config/.env.local exists and copies correctly **Steps:** 1. Ensure .docker/config/.env.local exists in repo 2. Run setup 3. Verify .env created in project root **Expected:** `.env` copied from `.docker/config/.env.local` **Edge cases:** - .docker/config/.env.local missing → Pause and prompt user --- ### 4. Clean Docker Volumes **Purpose:** Verify Docker volumes are cleaned before setup **Steps:** 1. Have existing Docker containers and volumes running 2. Run setup 3. Verify all containers stopped and removed 4. Verify all volumes removed **Expected:** - `docker ps -a` shows no containers - `docker volume ls` shows no volumes **Edge cases:** - No containers running → Commands succeed silently - No volumes exist → Commands succeed silently --- ### 5. Docker Setup **Purpose:** Test with/without docker-setup.sh present **Steps:** 1. Test with project containing docker-setup.sh 2. Test with project missing docker-setup.sh **Expected:** - With script: Runs `sh docker-setup.sh` - Without script: Pauses and notifies user --- ### 6. Server .env Copy **Purpose:** Verify scp copies .env to .server.env **Steps:** 1. Ensure .env exists on server 2. Run setup 3. Verify .server.env created locally 4. Run `git ls-files -v | grep .server.env` to verify assume-unchanged **Expected:** .server.env copied and marked with 'h' (assume-unchanged) **Edge cases:** - Server .env missing → Pause and prompt user --- ### 7. .env Modification **Purpose:** Check APP_NAME/APP_KEY extraction and insertion **Steps:** 1. Verify .server.env contains APP_NAME and APP_KEY 2. Run setup 3. Check local .env for updated values **Expected:** APP_NAME and APP_KEY from .server.env appear in local .env **Edge cases:** - APP_NAME missing in .server.env → Yellow warning, continues - APP_KEY missing in .server.env → Yellow warning, continues --- ### 8. .env.prod.local Creation **Purpose:** Verify all 5 variables populated correctly **Steps:** 1. Run setup with valid server credentials 2. Check .env.prod.local contents **Expected file contents:** ``` PROD_HOST="" PROD_USER="" PROD_DB_NAME="" PROD_DB_USER="" PROD_DB_PASS="" ``` --- ### 9. Helper Scripts **Purpose:** Verify ssh.sh created correctly **Steps:** 1. Run setup 2. Check ssh.sh exists with executable permission 3. Verify ssh.sh contains correct variables 4. Check .gitignore includes ssh.sh **Expected:** ssh.sh created with embedded credentials, added to .gitignore --- ### 10. Lazygit Upload **Purpose:** Verify upload and assume-unchanged on both server and local **Steps:** 1. Run setup 2. SSH to server, check lazygit exists in project 3. On server: `git ls-files -v | grep lazygit` shows 'h' 4. Locally: `git ls-files -v | grep lazygit` shows 'h' **Expected:** lazygit uploaded and marked assume-unchanged on both ends --- ### 11. SSH Keys - Case A **Purpose:** Server with only public key **Setup:** ```bash # On server rm ~/.ssh/id_rsa # Keep ~/.ssh/id_rsa.pub ``` **Steps:** 1. Run setup 2. Verify staging.key created locally 3. Verify both keys uploaded to server 4. Verify public key added to authorized_keys **Expected:** New keypair generated, uploaded, authorized --- ### 12. SSH Keys - Case B **Purpose:** Server with both keys **Setup:** ```bash # Server has both ~/.ssh/id_rsa and ~/.ssh/id_rsa.pub ``` **Steps:** 1. Run setup 2. Verify staging.key downloaded (matches server's id_rsa) 3. Verify public key in authorized_keys **Expected:** Private key downloaded as staging.key --- ### 13. SSH Keys - Case C **Purpose:** Server with neither key **Setup:** ```bash # On server rm -rf ~/.ssh/id_rsa ~/.ssh/id_rsa.pub # or rm -rf ~/.ssh ``` **Steps:** 1. Run setup 2. Verify ~/.ssh created on server 3. Verify both keys uploaded 4. Verify authorized_keys created/updated **Expected:** New keypair generated, ~/.ssh created, keys uploaded --- ### 14. staging.key Assume-Unchanged **Purpose:** Verify git tracking status **Steps:** 1. After setup, run: `git ls-files -v | grep staging.key` **Expected:** Output shows 'h staging.key' (lowercase h = assume-unchanged) --- ### 15. SSH-Add **Purpose:** Verify key added to agent **Steps:** 1. Ensure ssh-agent is running: `eval $(ssh-agent -s)` 2. Run setup 3. Check: `ssh-add -l` should show staging.key **Expected:** staging.key fingerprint shown in ssh-add -l **Edge cases:** - ssh-agent not running → Pause with instructions --- ### 16. db:wipe **Purpose:** Verify database wipe works **Steps:** 1. Ensure mtc-pharmacy-web container is running 2. Run setup 3. Verify db:wipe command executes **Expected:** Database wiped successfully **Edge cases:** - Container not running → Pause with instructions --- ### 17. db-sync **Purpose:** Verify make db-sync runs **Steps:** 1. Ensure Makefile exists with db-sync target 2. Ensure .env.prod.local has correct values 3. Run setup **Expected:** Database synced from staging **Edge cases:** - Makefile missing → Error from make - db-sync target missing → Error from make - Connection fails → Pause with instructions --- ## Edge Cases Summary | Scenario | Expected Behavior | |----------|-------------------| | Clone fails (wrong credentials) | Red error, exit | | Clone fails (repo doesn't exist) | Red error, exit | | .npmrc missing | Yellow pause, wait for user | | .docker/config/.env.local missing | Red error, pause, retry | | No Docker containers/volumes | Commands succeed silently | | docker-setup.sh missing | Yellow pause, notify user | | Server .env missing | Red error, pause, retry | | .server.env malformed | get_env_value returns empty, yellow warning | | ~/.ssh doesn't exist on server | Create directory (Case C) | | authorized_keys doesn't exist | Create with public key | | staging.key assume-unchanged fails | Suppress error, continue | | ssh-agent not running | Yellow warning, instructions, pause | | Docker container not running | Yellow warning, pause, retry | | make db-sync fails | Yellow warning, pause | ## Manual Verification Checklist - [ ] Clone test passes - [ ] .npmrc check pauses correctly - [ ] Docker env copied - [ ] Docker volumes cleaned - [ ] docker-setup.sh runs or notifies - [ ] Server .env copied to .server.env - [ ] .server.env marked assume-unchanged - [ ] APP_NAME/APP_KEY extracted and set - [ ] .env.prod.local has all 5 variables - [ ] ssh.sh created with correct variables - [ ] ssh.sh in .gitignore - [ ] staging.key in .gitignore - [ ] lazygit uploaded and assume-unchanged - [ ] SSH key management works (test appropriate case) - [ ] staging.key marked assume-unchanged - [ ] ssh-add succeeds - [ ] db:wipe runs - [ ] db-sync runs ## Cleanup After Testing ```bash # Remove test project locally rm -rf LOCAL_FOLDER # On server, if you modified SSH keys: # Restore original keys or regenerate # Remove any test databases ```