firstsun-dev_git-files-sync/tests/utils/version.test.ts
ClaudiaFang 4eebebc765 feat: show new feature tips after update
Adds a "what's new" modal shown once after the plugin updates to a new
version, so users don't miss what changed:

- New src/changelog.ts: a hand-curated CHANGELOG array (distinct from
  the auto-generated CHANGELOG.md, which lists every commit) where
  entries can be marked `notable` so they're called out separately
  from minor fixes, per the issue's clarification comment.
- New src/utils/version.ts: compareVersions() does numeric per-segment
  comparison (so "1.10.0" sorts after "1.9.0", unlike a plain string
  compare).
- getUnseenReleases() filters+sorts the changelog to what's newer than
  a given "last seen" version, extracted as a pure/testable function
  rather than inlined in main.ts (which isn't unit-tested in this repo).
- New settings field lastSeenVersion, persisted the same way as other
  settings. On a fresh install (empty lastSeenVersion) it's just
  recorded silently — no modal, since there's nothing to compare
  against. On an actual version bump, WhatsNewModal shows the unseen
  releases' highlights, with a "View full changelog" link out to
  CHANGELOG.md and a "Got it" dismiss; the version is recorded either
  way so the tip only ever shows once per upgrade.
- The whole check is wrapped in try/catch so a malformed version
  string can never break plugin startup.

Closes #39
2026-07-13 13:56:38 +00:00

27 lines
983 B
TypeScript

import { describe, it, expect } from 'vitest';
import { compareVersions } from '../../src/utils/version';
describe('compareVersions', () => {
it('returns 0 for equal versions', () => {
expect(compareVersions('1.2.1', '1.2.1')).toBe(0);
});
it('compares patch versions', () => {
expect(compareVersions('1.2.1', '1.2.0')).toBeGreaterThan(0);
expect(compareVersions('1.2.0', '1.2.1')).toBeLessThan(0);
});
it('compares numerically, not lexically, across double-digit segments', () => {
expect(compareVersions('1.10.0', '1.9.0')).toBeGreaterThan(0);
expect(compareVersions('1.9.0', '1.10.0')).toBeLessThan(0);
});
it('treats a missing segment as 0', () => {
expect(compareVersions('1.2', '1.2.0')).toBe(0);
expect(compareVersions('1.2.1', '1.2')).toBeGreaterThan(0);
});
it('treats a non-numeric segment as 0', () => {
expect(compareVersions('1.x.0', '1.0.0')).toBe(0);
});
});