diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index e0325e5..711f23b 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -23,18 +23,8 @@ jobs: username: ${{ secrets.DEPLOY_USER }} key: ${{ secrets.DEPLOY_SSH_KEY }} envs: DATABASE_URL,JWT_SECRET,API_KEY_PEPPER,PLATFORM_SECRET_KEY,USDC_ISSUER,STELLAR_NETWORK,STELLAR_HORIZON_URL,FRONTEND_URL,DEPLOY_PATH,SENTRY_RELEASE - env: - DATABASE_URL: ${{ secrets.DATABASE_URL }} - JWT_SECRET: ${{ secrets.JWT_SECRET }} - API_KEY_PEPPER: ${{ secrets.API_KEY_PEPPER }} - PLATFORM_SECRET_KEY: ${{ secrets.PLATFORM_SECRET_KEY }} - USDC_ISSUER: ${{ secrets.USDC_ISSUER }} - STELLAR_NETWORK: ${{ secrets.STELLAR_NETWORK }} - STELLAR_HORIZON_URL: ${{ secrets.STELLAR_HORIZON_URL }} - FRONTEND_URL: ${{ secrets.FRONTEND_URL }} - DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }} - SENTRY_RELEASE: ${{ github.sha }} script: | + set -euo pipefail cd "$DEPLOY_PATH" git fetch origin main @@ -56,6 +46,17 @@ jobs: docker compose -f docker-compose.prod.yml up -d --build docker compose -f docker-compose.prod.yml exec -T backend node db/migrate.js + env: + DATABASE_URL: ${{ secrets.DATABASE_URL }} + JWT_SECRET: ${{ secrets.JWT_SECRET }} + API_KEY_PEPPER: ${{ secrets.API_KEY_PEPPER }} + PLATFORM_SECRET_KEY: ${{ secrets.PLATFORM_SECRET_KEY }} + USDC_ISSUER: ${{ secrets.USDC_ISSUER }} + STELLAR_NETWORK: ${{ secrets.STELLAR_NETWORK }} + STELLAR_HORIZON_URL: ${{ secrets.STELLAR_HORIZON_URL }} + FRONTEND_URL: ${{ secrets.FRONTEND_URL }} + DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }} + SENTRY_RELEASE: ${{ github.sha }} - name: Wait for backend to become healthy run: | diff --git a/backend/src/services/sorobanService.test.js b/backend/src/services/sorobanService.test.js index 86fe52e..f88fb2e 100644 --- a/backend/src/services/sorobanService.test.js +++ b/backend/src/services/sorobanService.test.js @@ -10,7 +10,7 @@ * NODE_ENV=test node --test src/services/sorobanService.test.js */ -const { describe, it, beforeEach, afterEach } = require('node:test'); +const { describe, it, test, beforeEach, afterEach } = require('node:test'); const assert = require('node:assert/strict'); // --------------------------------------------------------------------------- @@ -236,7 +236,7 @@ describe('Soroban contract integration scenario — campaign milestone release', assert.equal(__mock.getCalls().length, 0); }); }); -const test = require('node:test'); + const proxyquire = require('proxyquire').noCallThru(); function buildService() { diff --git a/backend/src/services/userDashboard.test.js b/backend/src/services/userDashboard.test.js index 304f067..e9b1c8c 100644 --- a/backend/src/services/userDashboard.test.js +++ b/backend/src/services/userDashboard.test.js @@ -15,10 +15,10 @@ test('listCreatorCampaigns queries by creator_id', async () => { }, }); - const rows = await listCreatorCampaigns('user-1'); + const res = await listCreatorCampaigns('user-1'); assert.match(sql, /creator_id = \$1/); - assert.deepEqual(params, ['user-1']); - assert.equal(rows[0].title, 'Mine'); + assert.deepEqual(params, ['user-1', 20, 0]); + assert.equal(res.data[0].title, 'Mine'); }); test('listUserContributions includes conversion_rate', async () => { diff --git a/backend/src/services/userDashboardService.js b/backend/src/services/userDashboardService.js index 84830fe..fe92a61 100644 --- a/backend/src/services/userDashboardService.js +++ b/backend/src/services/userDashboardService.js @@ -189,7 +189,7 @@ async function getContributorDashboard(userId) { } function csvEscape(value) { - const str = value === null || value === undefined ? '' : String(value); + const str = (value === null || value === undefined) ? '' : String(value); if (/[",\n]/.test(str)) { return `"${str.replace(/"/g, '""')}"`; } diff --git a/frontend/eslint.config.cjs b/frontend/eslint.config.cjs index c528147..ac2fdc9 100644 --- a/frontend/eslint.config.cjs +++ b/frontend/eslint.config.cjs @@ -91,7 +91,7 @@ module.exports = [ afterEach: 'readonly', vi: 'readonly', jest: 'readonly', - global: 'readonly', + global: 'writable', }, }, },