diff --git a/.github/workflows/dhis2-verify-app.yml b/.github/workflows/dhis2-verify-app.yml index 8f8613c0..dd4b4019 100644 --- a/.github/workflows/dhis2-verify-app.yml +++ b/.github/workflows/dhis2-verify-app.yml @@ -82,9 +82,31 @@ jobs: - name: Lint run: yarn lint + test: + runs-on: ubuntu-latest + needs: lint + if: "!contains(github.event.head_commit.message, '[skip ci]')" + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 12.x + + - uses: actions/cache@v2 + id: yarn-cache + with: + path: '**/node_modules' + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + + - name: Test + run: yarn d2-app-scripts test --coverage + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v1 + publish: runs-on: ubuntu-latest - needs: [build, lint] + needs: [build, lint, test] if: "!contains(github.event.head_commit.message, '[skip ci]')" steps: - uses: actions/checkout@v2 diff --git a/package.json b/package.json index 765e071b..0d18d65e 100644 --- a/package.json +++ b/package.json @@ -36,5 +36,10 @@ }, "resolutions": { "@dhis2/ui": "^8.12.2" + }, + "jest": { + "collectCoverageFrom": [ + "src/**/*.js" + ] } } diff --git a/src/components/DownloadAs/use-hrefs.js b/src/components/DownloadAs/use-hrefs.js index 180a0f23..5abea092 100644 --- a/src/components/DownloadAs/use-hrefs.js +++ b/src/components/DownloadAs/use-hrefs.js @@ -7,8 +7,12 @@ const useHrefs = ({ endpoint, fileTypes, queryStr }) => { // based on query params, but older endpoints only take a timestamp queryStr = queryStr || `t=${timestamp}` + // removing leading slash for endpoint to make sure it works whether it's configured with slash or not + const sanitisedEndpoint = endpoint?.replace(/^\//, '') + const endpointUrl = `${baseUrl}/api/${apiVersion}/${sanitisedEndpoint}` + return fileTypes.reduce((acc, type) => { - const downloadUrl = `${baseUrl}/api/${apiVersion}/${endpoint}.${type}?${queryStr}` + const downloadUrl = `${endpointUrl}.${type}?${queryStr}` acc[type] = downloadUrl return acc }, {}) diff --git a/src/components/DownloadAs/use-hrefs.spec.js b/src/components/DownloadAs/use-hrefs.spec.js new file mode 100644 index 00000000..581ba803 --- /dev/null +++ b/src/components/DownloadAs/use-hrefs.spec.js @@ -0,0 +1,59 @@ +import useHrefs from './use-hrefs.js' + +jest.mock('@dhis2/app-runtime', () => ({ + useConfig: () => ({ + baseUrl: 'https://debug.dhis2.org/dev', + apiVersion: '41', + }), +})) + +describe('use-hrefs', () => { + const mockDate = 1694516945008 + + beforeEach(() => { + jest.spyOn(Date, 'now').mockReturnValueOnce(mockDate) + }) + + it('should generate correct urls', () => { + const result = useHrefs({ + endpoint: '/dataAnalysis/validationRules/report', + fileTypes: ['pdf', 'xls', 'csv'], + queryStr: undefined, + }) + expect(result.csv).toMatch( + `https://debug.dhis2.org/dev/api/41/dataAnalysis/validationRules/report.csv?t=${mockDate}` + ) + expect(result.pdf).toEqual( + `https://debug.dhis2.org/dev/api/41/dataAnalysis/validationRules/report.pdf?t=${mockDate}` + ) + expect(result.xls).toEqual( + `https://debug.dhis2.org/dev/api/41/dataAnalysis/validationRules/report.xls?t=${mockDate}` + ) + }) + it('should generate correct urls even if endpoint does not start with slash', () => { + const result = useHrefs({ + endpoint: 'dataAnalysis/validationRules/report', + fileTypes: ['pdf', 'xls', 'csv'], + queryStr: undefined, + }) + expect(result.csv).toMatch( + `https://debug.dhis2.org/dev/api/41/dataAnalysis/validationRules/report.csv?t=${mockDate}` + ) + expect(result.pdf).toEqual( + `https://debug.dhis2.org/dev/api/41/dataAnalysis/validationRules/report.pdf?t=${mockDate}` + ) + expect(result.xls).toEqual( + `https://debug.dhis2.org/dev/api/41/dataAnalysis/validationRules/report.xls?t=${mockDate}` + ) + }) + it('should generate correct urls even when passed query string', () => { + const result = useHrefs({ + endpoint: 'dataAnalysis/validationRules/report', + fileTypes: ['pdf', 'xls', 'csv'], + queryStr: 'locale=fr', + }) + expect(result.csv).toMatch( + 'https://debug.dhis2.org/dev/api/41/dataAnalysis/validationRules/report.csv?locale=fr' + ) + }) +})