Add Remediate workflow type to Ivanti Queue with remediation notes

- Add 'Remediate' as a valid workflow type (vendor-required, like FP/Archer)
- Create queue_remediation_notes table with FK cascade and 5000 char limit
- Add POST/GET /api/ivanti/todo-queue/:id/notes endpoints
- Include remediation_notes_count in queue item GET response
- Add RemediationModal component for viewing/adding notes
- Add notes count badge on Remediate queue items (purple #A855F7 theme)
- Add delete confirmation warning when removing items with notes
- Append remediation notes to Jira ticket descriptions
- Add property-based tests for all correctness properties
This commit is contained in:
Jordan Ramos
2026-06-08 14:07:59 -06:00
parent d4c428248a
commit 79f98414c4
13 changed files with 1803 additions and 28 deletions

View File

@@ -0,0 +1,79 @@
/**
* Property-Based Test: Note Count Badge Formatting
*
* Feature: ivanti-queue-remediation
* Property 12: Note count badge formatting
*
* For any integer count N where N > 0, the badge display SHALL show the string
* representation of N when N <= 99, and "99+" when N > 99. For N = 0, no badge
* SHALL be displayed.
*
* **Validates: Requirements 6.1, 6.2**
*/
import fc from 'fast-check';
// ---------------------------------------------------------------------------
// Pure function under test — extracted badge display logic
// ---------------------------------------------------------------------------
/**
* Determines the badge display value for a given note count.
* Returns null when no badge should be shown (count = 0).
*
* @param {number} count - The number of remediation notes
* @returns {string|null} The badge text, or null if no badge
*/
function formatBadgeCount(count) {
if (count <= 0) return null;
if (count > 99) return '99+';
return String(count);
}
// ---------------------------------------------------------------------------
// Property 12: Note count badge formatting
// ---------------------------------------------------------------------------
describe('Feature: ivanti-queue-remediation, Property 12: Note count badge formatting', () => {
it('displays the exact count for N where 1 <= N <= 99', () => {
fc.assert(
fc.property(
fc.integer({ min: 1, max: 99 }),
(count) => {
const badge = formatBadgeCount(count);
expect(badge).toBe(String(count));
}
),
{ numRuns: 100 }
);
});
it('displays "99+" for any count exceeding 99', () => {
fc.assert(
fc.property(
fc.integer({ min: 100, max: 100000 }),
(count) => {
const badge = formatBadgeCount(count);
expect(badge).toBe('99+');
}
),
{ numRuns: 100 }
);
});
it('returns null (no badge) for count = 0', () => {
const badge = formatBadgeCount(0);
expect(badge).toBeNull();
});
it('returns null (no badge) for negative counts', () => {
fc.assert(
fc.property(
fc.integer({ min: -1000, max: 0 }),
(count) => {
const badge = formatBadgeCount(count);
expect(badge).toBeNull();
}
),
{ numRuns: 100 }
);
});
});