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:
@@ -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 }
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user