Started: 89.08% backend / 97.01% frontend lines.
Landed: 99.69% backend / 98.62% frontend.
Closed gaps targeted at logic gates, branches, and assumption boundaries
that real users hit. Each test exercises a use case the production code
actually serves; nothing here is line-padding.
Backend additions:
- DeviceModelTest: pin landscape vs portrait dimension swap, plus the
nativeWidth/Height "ignore orientation" contract the firmware relies on.
- DeviceApiControllerTest: validation branches the PWA forms can't
even produce (raw API misuse) — non-array wakeTimes, non-int entries,
invalid rotation mode, invalid timezone, empty name, invalid orientation,
other-user PATCH returns 404. Plus full /preview coverage: 404 for
other-user / no-current / no-asset / missing-file / soft-deleted, and
happy paths for landscape AND portrait (the rotateImage(90) branch).
- ImageApiControllerTest: cropOrientation now exercised on both upload
and reprocess paths.
- TokenActionControllerTest: TK-01c covers the bad-device-id "continue"
branch in submit.
- RenderImageMessageHandlerTest: explicit portrait test pins the
rotateImage(-90) branch and the 192,000-byte EPD-native bin shape.
- SeedFakeDevicesCommandTest: 4 cases covering missing-user, fresh
create, idempotent re-run, and --remove path. The dev seed command
is load-bearing for the multi-frame UI; a silent break would surface
a week later.
- RerenderAssetsCommandTest: reset + dispatch path, no-assets path.
Frontend additions:
- FrameCardTest: lastSync-only and nextSync-only rendering branches.
- HomeView.test:
* + Add time fallback path when all 9 default candidates are taken.
* Multi-day "in Nd" nextSync formatting (offline / huge-interval case).
* Medium-horizon (5h) nextSync formats as clock-time + day label.
* visibilitychange triggers a silent re-fetch.
* add-photo handler creates input + navigates to /upload after pick.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -53,6 +53,29 @@ describe('FrameCard', () => {
|
||||
expect(wrapper.find('.frame-card__sync-line').exists()).toBe(false)
|
||||
})
|
||||
|
||||
// Cover the lastSync-without-nextSync branch: only the "synced X ago" span
|
||||
// renders, no separator, no nextSync.
|
||||
it('renders only lastSync when nextSync is absent', () => {
|
||||
const wrapper = mount(FrameCard, {
|
||||
props: { ...defaultProps, lastSync: '5m ago' },
|
||||
})
|
||||
const sync = wrapper.find('.frame-card__sync-line')
|
||||
expect(sync.text()).toContain('synced 5m ago')
|
||||
expect(sync.find('.frame-card__sync-sep').exists()).toBe(false)
|
||||
})
|
||||
|
||||
// Inverse: nextSync without lastSync (a never-seen device that already has
|
||||
// wakeTimes configured — the card should still preview the next slot).
|
||||
it('renders only nextSync when lastSync is absent', () => {
|
||||
const wrapper = mount(FrameCard, {
|
||||
props: { ...defaultProps, nextSync: 'next sync ~6 AM tomorrow' },
|
||||
})
|
||||
const sync = wrapper.find('.frame-card__sync-line')
|
||||
expect(sync.exists()).toBe(true)
|
||||
expect(sync.text()).toContain('next sync ~6 AM tomorrow')
|
||||
expect(sync.text()).not.toContain('synced')
|
||||
})
|
||||
|
||||
it('applies offline modifier class when status is offline', () => {
|
||||
const wrapper = mount(FrameCard, {
|
||||
props: { ...defaultProps, status: 'offline' },
|
||||
|
||||
Reference in New Issue
Block a user