Files
mtc-project-sync-script/verification.md

334 lines
8.0 KiB
Markdown

# 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="<extracted from SERVER_HOST>"
PROD_USER="<extracted from SERVER_HOST>"
PROD_DB_NAME="<DB_DATABASE from .server.env>"
PROD_DB_USER="<DB_USERNAME from .server.env>"
PROD_DB_PASS="<DB_PASSWORD from .server.env>"
```
---
### 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
```