151 lines
5.6 KiB
Bash
Executable File
151 lines
5.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
PASS=0; FAIL=0
|
|
|
|
ok() { echo " ✓ $*"; PASS=$((PASS+1)); }
|
|
fail(){ echo " ✗ $*"; FAIL=$((FAIL+1)); }
|
|
|
|
APP_URL="${APP_URL:-https://nimuli.com}"
|
|
PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
|
|
echo ""
|
|
echo "═══════════════════════════════════════════"
|
|
echo " Nimuli — Modal & Layout Verify"
|
|
echo " $(date '+%Y-%m-%d %H:%M:%S')"
|
|
echo "═══════════════════════════════════════════"
|
|
|
|
# ── 1. PHP / Composer ─────────────────────────
|
|
echo ""
|
|
echo "[ 1 ] Dependencies"
|
|
cd "$PROJECT_DIR"
|
|
docker compose exec -T app php artisan --version &>/dev/null && ok "Laravel reachable" || fail "Laravel not reachable"
|
|
|
|
# ── 2. wire-elements-modal present once ───────
|
|
echo ""
|
|
echo "[ 2 ] Modal container in layout"
|
|
LAYOUT="resources/views/layouts/nimuli-app.blade.php"
|
|
MODAL_COUNT=$(grep -c "wire-elements-modal\|livewire-ui-modal" "$LAYOUT" || true)
|
|
if [ "$MODAL_COUNT" -eq 1 ]; then
|
|
ok "Exactly 1 modal container in layout"
|
|
elif [ "$MODAL_COUNT" -eq 0 ]; then
|
|
fail "No modal container found in layout"
|
|
else
|
|
fail "Duplicate modal containers ($MODAL_COUNT) — remove one"
|
|
fi
|
|
|
|
# ── 3. Echo in bootstrap.js ───────────────────
|
|
echo ""
|
|
echo "[ 3 ] Laravel Echo"
|
|
if grep -q "new Echo" "resources/js/bootstrap.js"; then
|
|
ok "Echo instantiated in bootstrap.js"
|
|
else
|
|
fail "Echo missing from bootstrap.js"
|
|
fi
|
|
|
|
# ── 4. Cookie theme ───────────────────────────
|
|
echo ""
|
|
echo "[ 4 ] Theme cookie"
|
|
if grep -q "nimuli_theme" "bootstrap/app.php"; then
|
|
ok "nimuli_theme excluded from cookie encryption"
|
|
else
|
|
fail "nimuli_theme not excluded from EncryptCookies"
|
|
fi
|
|
if grep -q "document.cookie.*nimuli_theme" "resources/js/app.js"; then
|
|
ok "Theme cookie written in Alpine store"
|
|
else
|
|
fail "Alpine theme store does not write cookie"
|
|
fi
|
|
if grep -q "request()->cookie('nimuli_theme')" "resources/views/layouts/nimuli-app.blade.php"; then
|
|
ok "Layout reads theme cookie server-side"
|
|
else
|
|
fail "Layout does not read theme cookie server-side"
|
|
fi
|
|
|
|
# ── 5. PNG icons ──────────────────────────────
|
|
echo ""
|
|
echo "[ 5 ] Manifest icons"
|
|
for f in favicon-16x16.png favicon-32x32.png apple-touch-icon.png android-chrome-192x192.png android-chrome-512x512.png; do
|
|
if [ -f "public/$f" ]; then
|
|
ok "$f present"
|
|
else
|
|
fail "$f missing from public/"
|
|
fi
|
|
done
|
|
|
|
# ── 6. Modal component files ──────────────────
|
|
echo ""
|
|
echo "[ 6 ] Modal Livewire components"
|
|
MODALS=(
|
|
"app/Livewire/Modals/CreateLink.php"
|
|
"app/Livewire/Modals/EditLink.php"
|
|
"app/Livewire/Modals/DeleteLink.php"
|
|
"app/Livewire/Modals/CreateWorkspace.php"
|
|
"app/Livewire/Modals/DeleteWorkspace.php"
|
|
"app/Livewire/Modals/InviteMember.php"
|
|
"app/Livewire/Modals/EditMemberRole.php"
|
|
"app/Livewire/Modals/RemoveMember.php"
|
|
"app/Livewire/Modals/CreateWebhook.php"
|
|
"app/Livewire/Modals/DeleteWebhook.php"
|
|
"app/Livewire/Modals/CreateApiToken.php"
|
|
"app/Livewire/Modals/RevokeApiToken.php"
|
|
"app/Livewire/Modals/ConfirmAction.php"
|
|
)
|
|
for modal in "${MODALS[@]}"; do
|
|
if [ -f "$modal" ]; then
|
|
ok "$(basename "$modal" .php)"
|
|
else
|
|
fail "MISSING: $modal"
|
|
fi
|
|
done
|
|
|
|
# ── 7. Tests ──────────────────────────────────
|
|
echo ""
|
|
echo "[ 7 ] Test suite"
|
|
if docker compose exec -T app php artisan test --filter "LinksModals|WorkspaceModals|DevUserSeeder" 2>&1 | grep -q "passed"; then
|
|
ok "Pest tests pass"
|
|
else
|
|
echo " Running full suite (this may take a moment)..."
|
|
docker compose exec -T app php artisan test 2>&1 | tail -5
|
|
fail "Check output above"
|
|
fi
|
|
|
|
# ── 8. Build compiles ─────────────────────────
|
|
echo ""
|
|
echo "[ 8 ] Vite build"
|
|
if npm run build 2>&1 | grep -q "built in"; then
|
|
ok "Vite build clean"
|
|
else
|
|
fail "Vite build errors — check output"
|
|
fi
|
|
|
|
# ── 9. Seeders ────────────────────────────────
|
|
echo ""
|
|
echo "[ 9 ] Dev user seeder"
|
|
DB_USER=$(sed -n 's/^DB_USERNAME=//p' "$PROJECT_DIR/.env")
|
|
DB_PASS=$(sed -n 's/^DB_PASSWORD=//p' "$PROJECT_DIR/.env")
|
|
DB_NAME=$(sed -n 's/^DB_DATABASE=//p' "$PROJECT_DIR/.env")
|
|
USER_CNT=$(docker compose exec -T mysql mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" \
|
|
-se "SELECT COUNT(*) FROM users WHERE email='nexxo@nimuli.com';" 2>/dev/null || echo "0")
|
|
if [ "${USER_CNT:-0}" -gt 0 ]; then
|
|
ok "nexxo@nimuli.com exists in DB"
|
|
else
|
|
fail "nexxo@nimuli.com not found — run: php artisan db:seed"
|
|
fi
|
|
|
|
# ── Summary ───────────────────────────────────
|
|
echo ""
|
|
echo "═══════════════════════════════════════════"
|
|
TOTAL=$((PASS + FAIL))
|
|
echo " Passed: $PASS / $TOTAL"
|
|
if [ "$FAIL" -gt 0 ]; then
|
|
echo " Failed: $FAIL"
|
|
echo "═══════════════════════════════════════════"
|
|
echo ""
|
|
exit 1
|
|
else
|
|
echo " All checks passed ✓"
|
|
echo "═══════════════════════════════════════════"
|
|
echo ""
|
|
fi
|