Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 18 additions & 5 deletions .github/workflows/playwright.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ jobs:
playwright-tests:
timeout-minutes: 60
runs-on: ubuntu-latest
container: mcr.microsoft.com/playwright:v1.54.2-jammy # match your Playwright version
strategy:
fail-fast: false
matrix:
Expand All @@ -29,12 +30,20 @@ jobs:
with:
node-version: lts/*
cache: 'yarn'
cache-dependency-path: |
**/yarn.lock
**/package.json
registry-url: 'https://npm.pkg.github.com'
- name: Install dependencies
run: npm install -g yarn && yarn
- name: Install Playwright Browsers
run: yarn playwright install --with-deps
run: |
corepack enable
yarn install --immutable
# - name: Install Playwright Browsers
# run: yarn playwright install --with-deps
- name: Run Playwright tests
env:
HOME: /root
CI: 'true'
run: yarn playwright test --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
- name: Upload blob report to GitHub Actions Artifacts
if: ${{ !cancelled() }}
Expand All @@ -56,10 +65,14 @@ jobs:
with:
node-version: lts/*
cache: 'yarn'
cache-dependency-path: |
**/yarn.lock
**/package.json
registry-url: 'https://npm.pkg.github.com'
- name: Install dependencies
run: npm install -g yarn && yarn

run: |
corepack enable
yarn install --immutable
- name: Download blob reports from GitHub Actions Artifacts
uses: actions/download-artifact@v5
with:
Expand Down
38 changes: 19 additions & 19 deletions .github/workflows/pull-request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,25 +32,25 @@ jobs:
name: spinntektsmelding-frontend-artifact
path: ${{ github.workspace }}/build/**/*

Kodekvalitet:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
with:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: '24.0'
cache: 'yarn'
registry-url: 'https://npm.pkg.github.com'
- run: yarn install --immutable
- run: yarn test
- name: SonarCloud Scan
if: ${{ github.actor != 'dependabot[bot]' }}
uses: SonarSource/sonarqube-scan-action@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
# Kodekvalitet:
# runs-on: ubuntu-latest
# steps:
# - uses: actions/checkout@master
# with:
# fetch-depth: 0
# - uses: actions/setup-node@v4
# with:
# node-version: '24.0'
# cache: 'yarn'
# registry-url: 'https://npm.pkg.github.com'
# - run: yarn install --immutable
# - run: yarn test
# - name: SonarCloud Scan
# if: ${{ github.actor != 'dependabot[bot]' }}
# uses: SonarSource/sonarqube-scan-action@master
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

Eslint:
runs-on: ubuntu-latest
Expand Down
72 changes: 72 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
name: test
on: [push, pull_request]
permissions:
contents: read

env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_AUTH_TOKEN: ${{ secrets.READER_TOKEN }}
NODE_AUTH_TOKEN: ${{ secrets.READER_TOKEN }}

jobs:
vitest:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3, 4] # number of shards
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '24.0'
cache: 'yarn'
registry-url: 'https://npm.pkg.github.com'
- run: yarn install --immutable
- name: Run shard ${{ matrix.shard }}
env:
# unique sonar test execution file per shard (vitest-sonar-reporter)
VITEST_SONAR_FILE: sonar-report-${{ matrix.shard }}.xml
run: |
yarn test \
--shard ${{ matrix.shard }}/4 \
--reporter=default
- uses: actions/upload-artifact@v4
with:
name: coverage-${{ matrix.shard }}
path: |
coverage
sonar-report-*.xml

sonar:
name: SonarCloud
needs: vitest
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

# Download all shard artifacts into the workspace
- uses: actions/download-artifact@v4
with:
pattern: coverage-*
merge-multiple: true

# Merge coverage and gather test execution reports
- name: Merge coverage and collect reports
run: |
mkdir -p reports/sonar
# Merge LCOVs from all shards
npx --yes lcov-result-merger 'coverage/**/lcov.info' 'reports/lcov.info'
# Collect Generic Test Execution XMLs (from vitest-sonar-reporter)
mv sonar-report-*.xml reports/sonar/ || true
echo "SONAR_TEST_REPORTS=$(ls reports/sonar/*.xml 2>/dev/null | paste -sd, -)" >> $GITHUB_ENV

# Run SonarCloud analysis (requires SONAR_TOKEN secret).
- uses: SonarSource/sonarcloud-github-action@v2
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
with:
args: >
-Dsonar.javascript.lcov.reportPaths=reports/lcov.info
-Dsonar.testExecutionReportPaths=${{ env.SONAR_TEST_REPORTS }}
6 changes: 6 additions & 0 deletions __tests__/components/RefusjonArbeidsgiverBelop.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ describe('RefusjonArbeidsgiverBelop', () => {
onOppdaterBelop={onOppdaterBelop}
visFeilmeldingTekst={visFeilmeldingTekst}
arbeidsgiverperiodeDisabled={true}
onEditerbarChange={vi.fn()}
/>
);

Expand All @@ -53,6 +54,7 @@ describe('RefusjonArbeidsgiverBelop', () => {
onOppdaterBelop={onOppdaterBelop}
visFeilmeldingTekst={visFeilmeldingTekst}
arbeidsgiverperiodeDisabled={arbeidsgiverperiodeDisabled}
onEditerbarChange={vi.fn()}
/>
);

Expand All @@ -66,6 +68,7 @@ describe('RefusjonArbeidsgiverBelop', () => {
onOppdaterBelop={onOppdaterBelop}
visFeilmeldingTekst={visFeilmeldingTekst}
arbeidsgiverperiodeDisabled={arbeidsgiverperiodeDisabled}
onEditerbarChange={vi.fn()}
/>
);

Expand All @@ -75,12 +78,14 @@ describe('RefusjonArbeidsgiverBelop', () => {
});

it('should call onOppdaterBelop when the input field is changed', () => {
const onEditerbarChange = vi.fn();
render(
<RefusjonArbeidsgiverBelop
bruttoinntekt={bruttoinntekt}
onOppdaterBelop={onOppdaterBelop}
visFeilmeldingTekst={visFeilmeldingTekst}
arbeidsgiverperiodeDisabled={arbeidsgiverperiodeDisabled}
onEditerbarChange={onEditerbarChange}
/>
);

Expand All @@ -89,5 +94,6 @@ describe('RefusjonArbeidsgiverBelop', () => {
fireEvent.blur(screen.getByRole('textbox'));

expect(onOppdaterBelop).toHaveBeenCalledWith('600000');
expect(onEditerbarChange).toHaveBeenCalledWith(true);
});
});
25 changes: 25 additions & 0 deletions __tests__/mock-dekoratoren-moduler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { vi } from 'vitest';

// Mock Next navigation early (no real module import)
const router = { push: vi.fn(), replace: vi.fn(), prefetch: vi.fn() };
vi.mock('next/navigation', () => ({
useRouter: () => router,
usePathname: () => '/',
useSearchParams: () => ({ get: () => null, toString: () => '' }),
__mockedRouter: router
}));

// Mock NAV dekoratør so it doesn't touch window/timers in tests
vi.mock('@navikt/nav-dekoratoren-moduler', () => ({
__esModule: true,
init: vi.fn(() => ({ on: vi.fn(), setParams: vi.fn() })),
decoratorParamsFromEnv: vi.fn(() => ({}) as any),
fetchDecoratorHtml: vi.fn(async () => ({ headTags: '', body: '', footer: '', scripts: '' })),
logAmplitudeEvent: vi.fn(() => Promise.resolve()),
trackEvent: vi.fn(),
withNavContext: (component: any) => component,
setBreadcrumbs: vi.fn()
}));

// Optional: mock next/head to avoid DOM access
vi.mock('next/head', () => ({ __esModule: true, default: ({ children }: any) => children ?? null }));
52 changes: 52 additions & 0 deletions __tests__/state/useKvitteringInit.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -332,4 +332,56 @@ describe('useKvitteringInit', () => {
expect(result.current.kvitteringInnsendt).toEqual(new Date(kvitteringMedRefusjonSluttdato.kvitteringNavNo.mottatt));
expect(result.current.kvitteringInnsendt).toBeInstanceOf(Date);
});

it('should set the refusjon to yes if there are endringer', async () => {
const { result } = renderHook(() => useBoundStore((state) => state));

const { result: resp } = renderHook(() => useKvitteringInit());

const kvitteringInit = resp.current;

kvitteringMedRefusjonSluttdato.kvitteringNavNo.skjema.refusjon = {
beloepPerMaaned: 0.0,
endringer: [
{
beloep: 41000.4,
startdato: '2024-08-05'
}
]
};

act(() => {
kvitteringInit(kvitteringMedRefusjonSluttdato as unknown as KvitteringInit);
});

expect(result.current.harRefusjonEndringer).toBe('Ja');
expect(result.current.refusjonEndringer).toEqual([
{
beloep: 41000.4,
dato: parseIsoDate('2024-08-05')
}
]);
expect(result.current.lonnISykefravaeret.beloep).toBe(0.0);
});

it('should set the refusjon to No if there are no endringer', async () => {
const { result } = renderHook(() => useBoundStore((state) => state));

const { result: resp } = renderHook(() => useKvitteringInit());

const kvitteringInit = resp.current;

kvitteringMedRefusjonSluttdato.kvitteringNavNo.skjema.refusjon = {
beloepPerMaaned: 0.0,
endringer: []
};

act(() => {
kvitteringInit(kvitteringMedRefusjonSluttdato as unknown as KvitteringInit);
});

expect(result.current.harRefusjonEndringer).toBe('Nei');
expect(result.current.refusjonEndringer).toEqual([]);
expect(result.current.lonnISykefravaeret.beloep).toBe(0.0);
});
});
6 changes: 5 additions & 1 deletion components/RefusjonArbeidsgiver/RefusjonArbeidsgiver.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ export default function RefusjonArbeidsgiver({
(state) => state.arbeidsgiverBetalerHeleEllerDelerAvSykefravaeret
);
const begrunnelseRedusertUtbetaling = useBoundStore((state) => state.begrunnelseRedusertUtbetaling);
const setEndringerAvRefusjon = useBoundStore((state) => state.setEndringerAvRefusjon);

const beloepArbeidsgiverBetalerISykefravaeret = useBoundStore(
(state) => state.beloepArbeidsgiverBetalerISykefravaeret
);
Expand Down Expand Up @@ -84,6 +86,7 @@ export default function RefusjonArbeidsgiver({
arbeidsgiverperiodeKort && !behandlingsdager
? 'Betaler arbeidsgiver ut full lønn de første 16 dagene?'
: 'Betaler arbeidsgiver ut full lønn i arbeidsgiverperioden?';

return (
<>
<Heading3 unPadded>Utbetaling og refusjon</Heading3>
Expand Down Expand Up @@ -163,10 +166,11 @@ export default function RefusjonArbeidsgiver({
{lonnISykefravaeret?.status === 'Ja' && (
<>
<RefusjonArbeidsgiverBelop
bruttoinntekt={lonnISykefravaeret.beloep! || 0}
bruttoinntekt={lonnISykefravaeret.beloep || 0}
onOppdaterBelop={addIsDirtyForm(beloepArbeidsgiverBetalerISykefravaeret)}
visFeilmeldingTekst={visFeilmeldingTekst}
arbeidsgiverperiodeDisabled={arbeidsgiverperiodeDisabled}
onEditerbarChange={() => setEndringerAvRefusjon('Ja')}
/>

<RefusjonUtbetalingEndring
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,15 @@ interface RefusjonArbeidsgiverBelopProps {
onOppdaterBelop: (beloep: string) => void;
visFeilmeldingTekst: (feilmelding: string) => string;
arbeidsgiverperiodeDisabled?: boolean;
onEditerbarChange: (editerbar: boolean) => void;
}

export default function RefusjonArbeidsgiverBelop({
bruttoinntekt,
onOppdaterBelop,
visFeilmeldingTekst,
arbeidsgiverperiodeDisabled = false
arbeidsgiverperiodeDisabled = false,
onEditerbarChange
}: Readonly<RefusjonArbeidsgiverBelopProps>) {
const [editerbar, setEditerbar] = useState<boolean>(false);

Expand All @@ -26,6 +28,7 @@ export default function RefusjonArbeidsgiverBelop({

const handleButtonEndreBeloepClick = (e: React.MouseEvent<HTMLButtonElement>): void => {
e.preventDefault();
onEditerbarChange(true);
setEditerbar(true);
};

Expand Down
Loading
Loading