From e7ef9ae2df86ac7760fe4c36e4ad0e4147e49064 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 30 Jun 2026 08:53:44 +0200 Subject: [PATCH] Test mission skill modifiers --- src/components/MissionTab.jsx | 4 ++- src/tests/missionTab.test.js | 55 +++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/components/MissionTab.jsx b/src/components/MissionTab.jsx index 7bcbd73..132e47e 100644 --- a/src/components/MissionTab.jsx +++ b/src/components/MissionTab.jsx @@ -1212,6 +1212,7 @@ export default function MissionTab({ authedPlayer }) {
setMiniState(sceneIndex, { skillCustomModifier: Number(e.target.value || 0) })} @@ -1262,7 +1264,7 @@ export default function MissionTab({ authedPlayer }) {
Target Number - {skillBreakdown.target} + {skillBreakdown.target}
Base {skillBreakdown.characteristic}: {skillBreakdown.base}
diff --git a/src/tests/missionTab.test.js b/src/tests/missionTab.test.js index 9896e0b..a1d994d 100644 --- a/src/tests/missionTab.test.js +++ b/src/tests/missionTab.test.js @@ -1,5 +1,5 @@ import React from 'react'; -import { render, screen, waitFor } from '@testing-library/react'; +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import '@testing-library/jest-dom'; import axios from 'axios'; import MissionTab from '../components/MissionTab'; @@ -65,7 +65,7 @@ describe('MissionTab player view', () => { expect(screen.getByText('The kill-team translates into a silent system.')).toBeInTheDocument(); expect(screen.getByText('Secure the landing zone')).toBeInTheDocument(); - expect(screen.getByText('Spot movement')).toBeInTheDocument(); + expect(screen.getAllByText('Spot movement').length).toBeGreaterThan(0); expect(screen.getByText('Open in Dice Roller')).toBeInTheDocument(); expect(screen.queryByText('Table State')).not.toBeInTheDocument(); expect(screen.queryByText('GM')).not.toBeInTheDocument(); @@ -81,3 +81,54 @@ describe('MissionTab player view', () => { expect(axios.get).not.toHaveBeenCalledWith('/api/missions/active/current'); }); }); + +describe('MissionTab mini skill modifiers', () => { + beforeEach(() => { + jest.clearAllMocks(); + const activeMission = { + ...mission, + scenes: [{ + ...mission.scenes[0], + checks: [ + { name: 'Spot movement', skill: 'Awareness', characteristic: 'Per', target: 45, modifier: 0, reward: 'Act before the ambush.' }, + ], + }], + }; + + axios.get.mockImplementation((url) => { + if (url === '/api/missions') return Promise.resolve({ data: [activeMission] }); + if (url === '/api/missions/active/current') return Promise.resolve({ data: activeMission }); + if (url === '/api/missions/active/rolls/feed?limit=50') return Promise.resolve({ data: [] }); + if (url === '/api/players') return Promise.resolve({ data: [{ name: 'anders' }] }); + if (url === '/api/players/anders') { + return Promise.resolve({ + data: { + name: 'anders', + tabInfo: { + characteristics: { Per: 40 }, + skills: { 'Awareness (Per)': { trained: true } }, + wounds: { current: 20, total: 20 }, + }, + }, + }); + } + return Promise.resolve({ data: null }); + }); + }); + + test('uses skill difficulty and skill condition modifiers for a mission skill check target', async () => { + render(); + + await waitFor(() => expect(screen.getAllByText('Mini Roller').length).toBeGreaterThan(0)); + await waitFor(() => expect(screen.getAllByTestId('skill-target-number')[0]).toHaveTextContent('40')); + + fireEvent.change(screen.getAllByLabelText('Skill difficulty')[0], { target: { value: '30' } }); + expect(screen.getAllByTestId('skill-target-number')[0]).toHaveTextContent('70'); + + fireEvent.click(screen.getAllByText('Poor/no tools -10')[0]); + expect(screen.getAllByTestId('skill-target-number')[0]).toHaveTextContent('60'); + + fireEvent.change(screen.getAllByLabelText('Skill custom modifier')[0], { target: { value: '-5' } }); + expect(screen.getAllByTestId('skill-target-number')[0]).toHaveTextContent('55'); + }); +});