ChillSpace / Engineering transparency
All checks passedA clearer view
of our quality.
Every test, every result, and the work still ahead. Explore how we check the experience that helps you unwind.
60794e8973d939.3sPassing tests cover specific behaviours. The coverage figures include untested application modules, and the quality checks below show what still needs attention.
Code coverage
How much application code the test suite actually exercises.
Frontend behaviour
c8 / V8- Lines
- 85.1%
- Branches
- 78.8%
- Functions
- 92.2%
All runtime TypeScript files in src, including utilities and configuration modules not loaded by the tests. Astro templates, CSS, assets, type declarations and test files are excluded.
Coverage by file 37 files
| Application file | Lines | Branches |
|---|---|---|
| src/utils/procedural/types.ts | 0.0%0/184 | 0.0% |
| src/utils/playlist/PlaylistController.ts | 35.0%340/970 | 71.4% |
| src/utils/soundfonts/SoundFontLoader.ts | 73.9%136/184 | 61.3% |
| src/utils/playlist/PlaylistRenderer.ts | 78.9%232/294 | 63.9% |
| src/utils/SoundEngine.ts | 80.3%1527/1901 | 68.0% |
| src/utils/PlaylistStore.ts | 82.0%831/1013 | 70.6% |
| src/utils/audio/mobileAudio.ts | 82.3%186/226 | 79.2% |
| src/utils/audio/drumVoices.ts | 86.0%319/371 | 70.4% |
| src/utils/SleepscapeCardController.ts | 86.4%974/1127 | 73.8% |
| src/utils/interactions.ts | 89.0%283/318 | 64.7% |
| src/utils/QueueStore.ts | 89.4%456/510 | 61.1% |
| src/utils/playlist/PlaylistModals.ts | 94.7%356/376 | 79.7% |
| src/utils/storage.ts | 94.8%292/308 | 76.3% |
| src/utils/audio/audioExporter.ts | 95.3%656/688 | 90.1% |
| src/utils/audio/ambientLayers.ts | 95.6%783/819 | 88.3% |
| src/utils/procedural/cyberClientSync.ts | 97.7%208/213 | 88.2% |
| src/config/drums.ts | 100.0%125/125 | 100.0% |
| src/config/music.ts | 100.0%265/265 | 100.0% |
| src/config/narratives.ts | 100.0%42/42 | 100.0% |
| src/config/sceneDefaults.ts | 100.0%131/131 | 100.0% |
| src/config/sounds.ts | 100.0%67/67 | 100.0% |
| src/utils/audioData.ts | 100.0%100/100 | 100.0% |
| src/utils/powerUtils.ts | 100.0%78/78 | 81.8% |
| src/utils/audio/SpatialAudioHelper.ts | 100.0%451/451 | 92.6% |
| src/utils/audio/interactions/NoiseHelper.ts | 100.0%10/10 | 100.0% |
| src/utils/audio/interactions/cosmicInteractions.ts | 100.0%85/85 | 100.0% |
| src/utils/audio/interactions/cyberpunkInteractions.ts | 100.0%96/96 | 100.0% |
| src/utils/audio/interactions/forestInteractions.ts | 100.0%235/235 | 100.0% |
| src/utils/audio/interactions/lakeInteractions.ts | 100.0%268/268 | 100.0% |
| src/utils/audio/interactions/mistInteractions.ts | 100.0%136/136 | 100.0% |
| src/utils/audio/interactions/oceanInteractions.ts | 100.0%214/214 | 100.0% |
| src/utils/procedural/cyberBuildingGenerator.ts | 100.0%597/597 | 98.7% |
| src/utils/procedural/prng.ts | 100.0%90/90 | 100.0% |
| src/utils/sleepscape/storyCustomizer.ts | 100.0%185/185 | 73.0% |
| src/utils/sleepscape/storyExporter.ts | 100.0%94/94 | 71.4% |
| src/utils/sleepscape/storyVoiceData.ts | 100.0%95/95 | 100.0% |
| src/utils/sleepscape/ttsEndpoint.ts | 100.0%18/18 | 100.0% |
Backend behaviour
coverage.py- Lines
- 95.9%
- Branches
- 91.6%
- Functions
- Not measured
All Python application modules in api. Test files are excluded. Cloud storage and speech providers are mocked; this is not a live service availability check.
Coverage by file 3 files
| Application file | Lines | Branches |
|---|---|---|
| api/tts_providers.py | 84.6%33/39 | 62.5% |
| api/helpers.py | 95.8%114/119 | 97.5% |
| api/function_app.py | 97.0%420/433 | 91.6% |
Test outcomes
Every reported test case, grouped by its test file.
Audio.test.tsFrontend behaviour · 91 tests91 passed
| Test case | Result | Duration |
|---|---|---|
| forest: synthCampfireCrackle schedules finite sources into its output | passed | 15 ms |
| forest: synthWoodlandSnuffle schedules finite sources into its output | passed | 2 ms |
| forest: synthHutWoodCreak schedules finite sources into its output | passed | 2 ms |
| forest: synthBadgerGrumble schedules finite sources into its output | passed | 2 ms |
| forest: synthOwlNightHoot schedules finite sources into its output | passed | 2 ms |
| forest: synthPineNeedleRustle schedules finite sources into its output | passed | 2 ms |
| forest: synthBirdFlockChirp schedules finite sources into its output | passed | 2 ms |
| forest: synthTieredPineWind schedules finite sources into its output | passed | 1 ms |
| ocean: synthCrabClick schedules finite sources into its output | passed | 2 ms |
| ocean: synthWaterOarDip schedules finite sources into its output | passed | 2 ms |
| ocean: synthLighthouseBell schedules finite sources into its output | passed | 1 ms |
| ocean: synthSealSplashChime schedules finite sources into its output | passed | 2 ms |
| ocean: synthSailboatWaveLapping schedules finite sources into its output | passed | 2 ms |
| ocean: synthSeagullCryChime schedules finite sources into its output | passed | 2 ms |
| ocean: synthSeagullFlockChorus schedules finite sources into its output | passed | 2 ms |
| cosmic: synthMoonGlowChime schedules finite sources into its output | passed | 2 ms |
| cosmic: synthCosmicWobble schedules finite sources into its output | passed | 2 ms |
| cosmic: synthStargazerLantern schedules finite sources into its output | passed | 2 ms |
| cosmic: synthCelestialStarGlass schedules finite sources into its output | passed | 2 ms |
| cyberpunk: synthCatPurrChime schedules finite sources into its output | passed | 2 ms |
| cyberpunk: synthHovercarSpinner schedules finite sources into its output | passed | 2 ms |
| cyberpunk: synthCleanerRigWiper schedules finite sources into its output | passed | 2 ms |
| cyberpunk: synthNoodleNeonBuzz schedules finite sources into its output | passed | 2 ms |
| mist: synthMonkSingingBowl schedules finite sources into its output | passed | 2 ms |
| mist: synthTempleBell schedules finite sources into its output | passed | 2 ms |
| mist: synthGoatAlpineBell schedules finite sources into its output | passed | 2 ms |
| mist: synthLanternShimmer schedules finite sources into its output | passed | 2 ms |
| mist: synthShishiOdoshiClack schedules finite sources into its output | passed | 2 ms |
| mist: synthToriiWindChime schedules finite sources into its output | passed | 2 ms |
| mist: synthVillageBellHearth schedules finite sources into its output | passed | 2 ms |
| lake: synthFrogCroakChime schedules finite sources into its output | passed | 2 ms |
| lake: synthWoodBlockHit schedules finite sources into its output | passed | 2 ms |
| lake: synthCraneWingFlap schedules finite sources into its output | passed | 2 ms |
| lake: synthStoneBridgeBrook schedules finite sources into its output | passed | 2 ms |
| lake: synthStoneArchEcho schedules finite sources into its output | passed | 2 ms |
| lake: synthWaterCarrierFootsteps schedules finite sources into its output | passed | 10 ms |
| lake: synthVillageBarnTimber schedules finite sources into its output | passed | 2 ms |
| lake: synthOakBarrelKnock schedules finite sources into its output | passed | 2 ms |
| lake: synthVillageWellPulley schedules finite sources into its output | passed | 1 ms |
| lake: synthSwanGlideRipples schedules finite sources into its output | passed | 2 ms |
| ambient: synthCricketChirp builds a connected scheduled graph | passed | 3 ms |
| ambient: synthOwlHoot builds a connected scheduled graph | passed | 3 ms |
| ambient: synthSeagull builds a connected scheduled graph | passed | 3 ms |
| ambient: synthChime builds a connected scheduled graph | passed | 3 ms |
| ambient: synthMeteorWhistle builds a connected scheduled graph | passed | 3 ms |
| ambient: synthTempleBowl builds a connected scheduled graph | passed | 2 ms |
| ambient: synthBambooFlute builds a connected scheduled graph | passed | 2 ms |
| ambient: synthWaterDrop builds a connected scheduled graph | passed | 2 ms |
| ambient: synthRainDrop builds a connected scheduled graph | passed | 2 ms |
| layer cyberHum starts and stops without leaving its sources connected | passed | 11 ms |
| layer neonPulse starts and stops without leaving its sources connected | passed | 3 ms |
| layer holoChimes starts and stops without leaving its sources connected | passed | 3 ms |
| layer crickets starts and stops without leaving its sources connected | passed | 3 ms |
| layer owl starts and stops without leaving its sources connected | passed | 3 ms |
| layer rustle starts and stops without leaving its sources connected | passed | 3 ms |
| layer seagulls starts and stops without leaving its sources connected | passed | 3 ms |
| layer chimes starts and stops without leaving its sources connected | passed | 3 ms |
| layer foam starts and stops without leaving its sources connected | passed | 3 ms |
| layer glassChimes starts and stops without leaving its sources connected | passed | 4 ms |
| layer stellarPulse starts and stops without leaving its sources connected | passed | 3 ms |
| layer meteorWhistle starts and stops without leaving its sources connected | passed | 3 ms |
| layer templeBowl starts and stops without leaving its sources connected | passed | 3 ms |
| layer bambooFlute starts and stops without leaving its sources connected | passed | 3 ms |
| layer mountainGust starts and stops without leaving its sources connected | passed | 3 ms |
| layer waterDrops starts and stops without leaving its sources connected | passed | 3 ms |
| layer lakeInsects starts and stops without leaving its sources connected | passed | 4 ms |
| layer echoChimes starts and stops without leaving its sources connected | passed | 12 ms |
| layer rain starts and stops without leaving its sources connected | passed | 3 ms |
| forest: offline beds, music, drums and layers connect to the export bus | passed | 8 ms |
| ocean: offline beds, music, drums and layers connect to the export bus | passed | 10 ms |
| cosmic: offline beds, music, drums and layers connect to the export bus | passed | 23 ms |
| mist: offline beds, music, drums and layers connect to the export bus | passed | 10 ms |
| lake: offline beds, music, drums and layers connect to the export bus | passed | 9 ms |
| cyberpunk: offline beds, music, drums and layers connect to the export bus | passed | 19 ms |
| WAV export preserves 1 channels, PCM clipping, length and RIFF metadata | passed | 3 ms |
| WAV export preserves 2 channels, PCM clipping, length and RIFF metadata | passed | 2 ms |
| MP3 tags contain requested metadata and encoded PCM is clipped | passed | 2 ms |
| spatial off: routing respects channels and saved preference | passed | 2 ms |
| spatial binaural: routing respects channels and saved preference | passed | 1 ms |
| spatial surround: routing respects channels and saved preference | passed | 2 ms |
| drum voice lofi: all percussion sources schedule and stop | passed | 2 ms |
| drum voice electro: all percussion sources schedule and stop | passed | 2 ms |
| drum voice sf2-kit: all percussion sources schedule and stop | passed | 1 ms |
| drum voice brush-acoustic: all percussion sources schedule and stop | passed | 2 ms |
| drum voice lofi-electric: all percussion sources schedule and stop | passed | 2 ms |
| forest: playback toggles, gain controls and transport preserve explicit state | passed | 50 ms |
| ocean: playback toggles, gain controls and transport preserve explicit state | passed | 12 ms |
| cosmic: playback toggles, gain controls and transport preserve explicit state | passed | 10 ms |
| mist: playback toggles, gain controls and transport preserve explicit state | passed | 13 ms |
| lake: playback toggles, gain controls and transport preserve explicit state | passed | 9 ms |
| cyberpunk: playback toggles, gain controls and transport preserve explicit state | passed | 27 ms |
AudioEdges.test.tsFrontend behaviour · 39 tests39 passed
| Test case | Result | Duration |
|---|---|---|
| Master export wav, active tracks=false: output type, channel count and completion progress | passed | 43 ms |
| Master export wav, active tracks=true: output type, channel count and completion progress | passed | 42 ms |
| Master export wav51, active tracks=false: output type, channel count and completion progress | passed | 15 ms |
| Master export wav51, active tracks=true: output type, channel count and completion progress | passed | 24 ms |
| Master export mp3, active tracks=false: output type, channel count and completion progress | passed | 14 ms |
| Master export mp3, active tracks=true: output type, channel count and completion progress | passed | 22 ms |
| Chord and harmony voice sine supports key, volume and stop transitions | passed | 10 ms |
| Chord and harmony voice vangelis supports key, volume and stop transitions | passed | 8 ms |
| Chord and harmony voice space-organ supports key, volume and stop transitions | passed | 8 ms |
| Chord and harmony voice angelic supports key, volume and stop transitions | passed | 7 ms |
| Chord and harmony voice glass supports key, volume and stop transitions | passed | 7 ms |
| Chord and harmony voice warm-pad supports key, volume and stop transitions | passed | 12 ms |
| Chord and harmony voice sf2-acoustic-harp supports key, volume and stop transitions | passed | 13 ms |
| Chord and harmony voice sf2-strings supports key, volume and stop transitions | passed | 9 ms |
| Chord and harmony voice sf2-music-box supports key, volume and stop transitions | passed | 17 ms |
| Chord and harmony voice sf2-tubular-bells supports key, volume and stop transitions | passed | 10 ms |
| Spatial wind drift uses modern panner API and cleanup | passed | 3 ms |
| Spatial wind drift uses legacy panner API and cleanup | passed | 2 ms |
| Spatial wind drift uses stereo panner API and cleanup | passed | 1 ms |
| Spatial wind drift uses surround panner API and cleanup | passed | 2 ms |
| Spatial water drift uses modern panner API and cleanup | passed | 1 ms |
| Spatial water drift uses legacy panner API and cleanup | passed | 2 ms |
| Spatial water drift uses stereo panner API and cleanup | passed | 2 ms |
| Spatial water drift uses surround panner API and cleanup | passed | 2 ms |
| Spatial bird drift uses modern panner API and cleanup | passed | 1 ms |
| Spatial bird drift uses legacy panner API and cleanup | passed | 1 ms |
| Spatial bird drift uses stereo panner API and cleanup | passed | 1 ms |
| Spatial bird drift uses surround panner API and cleanup | passed | 1 ms |
| Spatial cosmic drift uses modern panner API and cleanup | passed | 1 ms |
| Spatial cosmic drift uses legacy panner API and cleanup | passed | 1 ms |
| Spatial cosmic drift uses stereo panner API and cleanup | passed | 1 ms |
| Spatial cosmic drift uses surround panner API and cleanup | passed | 1 ms |
| Spatial vehicle drift uses modern panner API and cleanup | passed | 13 ms |
| Spatial vehicle drift uses legacy panner API and cleanup | passed | 2 ms |
| Spatial vehicle drift uses stereo panner API and cleanup | passed | 1 ms |
| Spatial vehicle drift uses surround panner API and cleanup | passed | 1 ms |
| Spatial preferences resolve legacy booleans, inferred hardware and legacy panners | passed | 2 ms |
| Mobile media controls call supplied callbacks, recover focus and release wake locks | passed | 3 ms |
| Soundfont decoded zones select pitch, loop points and scheduling safely | passed | 3 ms |
Controllers.test.tsFrontend behaviour · 29 tests29 passed
| Test case | Result | Duration |
|---|---|---|
| Card page controls, story selection and settings remain in sync with storage | passed | 49 ms |
| Card service narration 1ch: starts, caches, pauses and completes a story | passed | 20 ms |
| Card service narration 2ch: starts, caches, pauses and completes a story | passed | 15 ms |
| Card service narration prefetches the next paragraph during playback and shares an in-flight request | passed | 23 ms |
| Older narrators send their deeper pitch and cache separately from the plain voice | passed | 12 ms |
| Card global hooks pause, resume, apply URL story and clean up subscriptions | passed | 19 ms |
| Shared narration autoplay waits for gesture when unlocked=false | passed | 17 ms |
| Shared narration autoplay waits for gesture when unlocked=true | passed | 27 ms |
| New playlist modal confirm commits only deliberate confirmation | passed | 6 ms |
| New playlist modal cancel commits only deliberate confirmation | passed | 3 ms |
| Edit track save does not leak handlers | passed | 4 ms |
| Edit track cancel does not leak handlers | passed | 4 ms |
| Edit playlist save does not leak handlers | passed | 4 ms |
| Edit playlist cancel does not leak handlers | passed | 3 ms |
| Playlist conflict keep-both resolves once and hides dialog | passed | 4 ms |
| Playlist conflict merge resolves once and hides dialog | passed | 3 ms |
| Playlist conflict overwrite resolves once and hides dialog | passed | 3 ms |
| Playlist conflict cancel resolves once and hides dialog | passed | 12 ms |
| Mix title prompt and generic confirmation confirm | passed | 5 ms |
| Mix title prompt and generic confirmation cancel | passed | 5 ms |
| Shared playlist welcome existing=false owner=false | passed | 7 ms |
| Shared playlist welcome existing=false owner=true | passed | 4 ms |
| Shared playlist welcome existing=true owner=false | passed | 5 ms |
| Shared playlist welcome existing=true owner=true | passed | 8 ms |
| Owned playlist auto-sync reports success without modifying ownership | passed | 6 ms |
| Owned playlist auto-sync reports error without modifying ownership | passed | 2 ms |
| Owned playlist auto-sync reports network without modifying ownership | passed | 24 ms |
| Playlist CRUD validates missing targets, isolates forks and round trips import | passed | 5 ms |
| Followed playlist refresh updates public data and preserves local identity | passed | 8 ms |
Core.test.tsFrontend behaviour · 54 tests54 passed
| Test case | Result | Duration |
|---|---|---|
| Mulberry32 matches reference vectors and preserves deterministic seed contracts | passed | 3 ms |
| Procedural far/flat: stable seed, finite geometry and SVG output | passed | 284 ms |
| Procedural far/triangular: stable seed, finite geometry and SVG output | passed | 212 ms |
| Procedural mid/flat: stable seed, finite geometry and SVG output | passed | 189 ms |
| Procedural mid/triangular: stable seed, finite geometry and SVG output | passed | 160 ms |
| Procedural near/flat: stable seed, finite geometry and SVG output | passed | 182 ms |
| Procedural near/triangular: stable seed, finite geometry and SVG output | passed | 155 ms |
| Scene catalog has complete stories, playable defaults and stable text helpers | passed | <1 ms |
| Storage round trips settings, recovers malformed JSON and clears all domains | passed | 11 ms |
| Power policy respects explicit preferences and battery changes | passed | 4 ms |
| Interactive trigger campfire reaches the selected scene destination | passed | 3 ms |
| Interactive trigger hedgehog reaches the selected scene destination | passed | 3 ms |
| Interactive trigger hut reaches the selected scene destination | passed | 1 ms |
| Interactive trigger badger reaches the selected scene destination | passed | 1 ms |
| Interactive trigger owl reaches the selected scene destination | passed | 1 ms |
| Interactive trigger pinetree reaches the selected scene destination | passed | 2 ms |
| Interactive trigger bird reaches the selected scene destination | passed | 1 ms |
| Interactive trigger birdflock reaches the selected scene destination | passed | 1 ms |
| Interactive trigger tieredpine reaches the selected scene destination | passed | 1 ms |
| Interactive trigger crab reaches the selected scene destination | passed | 2 ms |
| Interactive trigger boat reaches the selected scene destination | passed | 2 ms |
| Interactive trigger lighthouse reaches the selected scene destination | passed | 2 ms |
| Interactive trigger seal reaches the selected scene destination | passed | 2 ms |
| Interactive trigger sailboat reaches the selected scene destination | passed | 2 ms |
| Interactive trigger seagull reaches the selected scene destination | passed | 2 ms |
| Interactive trigger seagullflock reaches the selected scene destination | passed | 2 ms |
| Interactive trigger monk reaches the selected scene destination | passed | 2 ms |
| Interactive trigger pagoda reaches the selected scene destination | passed | 2 ms |
| Interactive trigger goat reaches the selected scene destination | passed | 2 ms |
| Interactive trigger lanterns reaches the selected scene destination | passed | 2 ms |
| Interactive trigger shishiodoshi reaches the selected scene destination | passed | 1 ms |
| Interactive trigger toriigate reaches the selected scene destination | passed | 2 ms |
| Interactive trigger village reaches the selected scene destination | passed | 1 ms |
| Interactive trigger moon reaches the selected scene destination | passed | 2 ms |
| Interactive trigger observatory reaches the selected scene destination | passed | 1 ms |
| Interactive trigger stargazer reaches the selected scene destination | passed | 1 ms |
| Interactive trigger celestialbird reaches the selected scene destination | passed | 1 ms |
| Interactive trigger cat reaches the selected scene destination | passed | 1 ms |
| Interactive trigger hovercar reaches the selected scene destination | passed | 1 ms |
| Interactive trigger cleanerrig reaches the selected scene destination | passed | 1 ms |
| Interactive trigger noodlebar reaches the selected scene destination | passed | 2 ms |
| Interactive trigger frog reaches the selected scene destination | passed | 2 ms |
| Interactive trigger crane reaches the selected scene destination | passed | 2 ms |
| Interactive trigger bridge reaches the selected scene destination | passed | 2 ms |
| Interactive trigger stonearch reaches the selected scene destination | passed | 2 ms |
| Interactive trigger carrier reaches the selected scene destination | passed | 2 ms |
| Interactive trigger barn reaches the selected scene destination | passed | 2 ms |
| Interactive trigger barrels reaches the selected scene destination | passed | 2 ms |
| Interactive trigger well reaches the selected scene destination | passed | 1 ms |
| Interactive trigger swan reaches the selected scene destination | passed | 2 ms |
| Interactive trigger default reaches the selected scene destination | passed | 2 ms |
| Story customisation uses text nodes, persists values and restores defaults | passed | 11 ms |
| Offline story 1 channels: fetch cache reuse and ordered starts | passed | 5 ms |
| Offline story 2 channels: fetch cache reuse and ordered starts | passed | 3 ms |
Mutation.test.tsFrontend behaviour · 66 tests66 passed
| Test case | Result | Duration |
|---|---|---|
| Seeded random numerical contract covers zero, negatives, strings, bounds and shuffle independence | passed | 5 ms |
| Story label formatting hero_name | passed | <1 ms |
| Story label formatting companion_name | passed | <1 ms |
| Story label formatting magic_item | passed | <1 ms |
| Story label formatting HERO_NAME | passed | 2 ms |
| Story label formatting empty | passed | <1 ms |
| Story label formatting foo_bar_baz | passed | <1 ms |
| Story speech punctuation: "*soft*" | passed | <1 ms |
| Story speech punctuation: "a—b" | passed | <1 ms |
| Story speech punctuation: "a–b" | passed | <1 ms |
| Story speech punctuation: "Wait...Next" | passed | <1 ms |
| Story speech punctuation: "“hello”" | passed | <1 ms |
| Story speech punctuation: "one,,two" | passed | <1 ms |
| Story speech punctuation: " a \n b" | passed | <1 ms |
| Story speech punctuation: "" | passed | <1 ms |
| Story speech punctuation: "plain" | passed | <1 ms |
| Paragraph hash uses published FNV-1a vector and unsigned encoding | passed | <1 ms |
| Surround reference vector 0,-5 matches discrete speaker gains | passed | 14 ms |
| Surround reference vector -5,-5 matches discrete speaker gains | passed | 4 ms |
| Surround reference vector 5,-5 matches discrete speaker gains | passed | 2 ms |
| Surround reference vector -5,5 matches discrete speaker gains | passed | 2 ms |
| Surround reference vector 5,5 matches discrete speaker gains | passed | 3 ms |
| Surround reference vector 0,0 matches discrete speaker gains | passed | 2 ms |
| Surround reference vector 2.5,0 matches discrete speaker gains | passed | 2 ms |
| Surround reference vector 50,-50 matches discrete speaker gains | passed | 2 ms |
| Spatial resolution 2ch / automatic -> off | passed | 3 ms |
| Spatial resolution 6ch / automatic -> surround | passed | 2 ms |
| Spatial resolution 8ch / automatic -> surround | passed | 2 ms |
| Spatial resolution 2ch / surround -> off | passed | 2 ms |
| Spatial resolution 6ch / surround -> surround | passed | 2 ms |
| Spatial resolution 2ch / binaural -> binaural | passed | 2 ms |
| Spatial resolution 8ch / off -> off | passed | 2 ms |
| Panner configuration, listener orientation and legacy coordinate APIs are exact | passed | 3 ms |
| Panning chain off / direct preserves routing | passed | 3 ms |
| Panning chain off / stereoPan,panSlewTo preserves routing | passed | 2 ms |
| Panning chain off / spatialStart,spatialSwoopTo preserves routing | passed | 2 ms |
| Panning chain binaural / direct preserves routing | passed | 2 ms |
| Panning chain binaural / stereoPan,panSlewTo preserves routing | passed | 2 ms |
| Panning chain binaural / spatialStart,spatialSwoopTo preserves routing | passed | 2 ms |
| Panning chain surround / direct preserves routing | passed | 2 ms |
| Panning chain surround / stereoPan,panSlewTo preserves routing | passed | 2 ms |
| Panning chain surround / spatialStart,spatialSwoopTo preserves routing | passed | 2 ms |
| Element viewport mapping 0,0 | passed | 3 ms |
| Element viewport mapping 500,250 | passed | 2 ms |
| Element viewport mapping 1000,500 | passed | 2 ms |
| Drift reference wind/modern: position, travel time, alternation and stop | passed | 3 ms |
| Drift reference wind/stereo: position, travel time, alternation and stop | passed | 2 ms |
| Drift reference wind/legacy: position, travel time, alternation and stop | passed | 2 ms |
| Drift reference wind/surround: position, travel time, alternation and stop | passed | 2 ms |
| Drift reference water/modern: position, travel time, alternation and stop | passed | 2 ms |
| Drift reference water/stereo: position, travel time, alternation and stop | passed | 2 ms |
| Drift reference water/legacy: position, travel time, alternation and stop | passed | 11 ms |
| Drift reference water/surround: position, travel time, alternation and stop | passed | 2 ms |
| Drift reference bird/modern: position, travel time, alternation and stop | passed | 2 ms |
| Drift reference bird/stereo: position, travel time, alternation and stop | passed | 2 ms |
| Drift reference bird/legacy: position, travel time, alternation and stop | passed | 2 ms |
| Drift reference bird/surround: position, travel time, alternation and stop | passed | 2 ms |
| Drift reference cosmic/modern: position, travel time, alternation and stop | passed | 2 ms |
| Drift reference cosmic/stereo: position, travel time, alternation and stop | passed | 3 ms |
| Drift reference cosmic/legacy: position, travel time, alternation and stop | passed | 4 ms |
| Drift reference cosmic/surround: position, travel time, alternation and stop | passed | 6 ms |
| Drift reference vehicle/modern: position, travel time, alternation and stop | passed | 2 ms |
| Drift reference vehicle/stereo: position, travel time, alternation and stop | passed | 2 ms |
| Drift reference vehicle/legacy: position, travel time, alternation and stop | passed | 2 ms |
| Drift reference vehicle/surround: position, travel time, alternation and stop | passed | 2 ms |
| Orbit reference advances with specified speed, radius and elevation | passed | 3 ms |
Narration.test.tsFrontend behaviour · 5 tests5 passed
| Test case | Result | Duration |
|---|---|---|
| device fallback selects voice, speed and volume and advances with pause | passed | 12 ms |
| stop cancels device speech and stale completion cannot advance | passed | <1 ms |
| last paragraph completes and device errors stop playback | passed | <1 ms |
| unsupported devices show clear status | passed | <1 ms |
| service error switches to device narration | passed | 14 ms |
PlaylistFlyout.test.tsFrontend behaviour · 2 tests2 passed
| Test case | Result | Duration |
|---|---|---|
| Drawer opens and closes properly on handle click | passed | 213 ms |
| Grab bars and reordering are only enabled when user has permission | passed | 5 ms |
QueueStore.test.tsFrontend behaviour · 7 tests7 passed
| Test case | Result | Duration |
|---|---|---|
| removing item 0 preserves the playing item and persisted cursor | passed | 30 ms |
| removing item 1 preserves the playing item and persisted cursor | passed | 4 ms |
| removing item 3 preserves the playing item and persisted cursor | passed | 4 ms |
| Pub/Sub: emits "queue:updated" and updates state on addToQueue and clearQueue | passed | 3 ms |
| Pub/Sub: emits "queue:track-started", "queue:track-ended", and "queue:completed" on lifecycle progression | passed | 8 ms |
| reorderQueue: dynamically updates queue positions on the fly and maintains active index | passed | 6 ms |
| localStorage: persists queue and current active track position across store reloads | passed | 5 ms |
Storage.test.tsFrontend behaviour · 14 tests14 passed
| Test case | Result | Duration |
|---|---|---|
| audio: settings remain usable when browser storage is unavailable | passed | 14 ms |
| voice: settings remain usable when browser storage is unavailable | passed | 4 ms |
| ui: settings remain usable when browser storage is unavailable | passed | 3 ms |
| content: settings remain usable when browser storage is unavailable | passed | 4 ms |
| chillspace_audio_settings: missing settings return independent nested defaults | passed | 11 ms |
| chillspace_audio_settings: {broken settings return independent nested defaults | passed | 3 ms |
| chillspace_audio_settings: {} settings return independent nested defaults | passed | 2 ms |
| chillspace_voice_settings: missing settings return independent nested defaults | passed | 2 ms |
| chillspace_voice_settings: {broken settings return independent nested defaults | passed | 2 ms |
| chillspace_voice_settings: {} settings return independent nested defaults | passed | 1 ms |
| chillspace_user_content: missing settings return independent nested defaults | passed | 6 ms |
| chillspace_user_content: {broken settings return independent nested defaults | passed | 2 ms |
| chillspace_user_content: {} settings return independent nested defaults | passed | 1 ms |
| server-side storage defaults remain isolated without localStorage | passed | <1 ms |
TtsEndpoint.test.tsFrontend behaviour · 2 tests2 passed
| Test case | Result | Duration |
|---|---|---|
| narration uses the same-origin API in production and the Functions host locally | passed | 1 ms |
| narration URLs encode parameters and carry the audio version past stale browser caches | passed | <1 ms |
test_backend.pyBackend behaviour · 5 tests5 passed
| Test case | Result | Duration |
|---|---|---|
| audio magic bytes validation | passed | <1 ms |
| custom words creates unique hash | passed | <1 ms |
| deterministic hash | passed | <1 ms |
| duration creates unique hash | passed | <1 ms |
| speaker and speed creates unique hash | passed | <1 ms |
test_contracts.pyBackend behaviour · 22 tests22 passed
| Test case | Result | Duration |
|---|---|---|
| audio stream formats download and missing | passed | 38 ms |
| audio upload authorization and size limits | passed | 9 ms |
| audio upload formats and storage failures | passed | 413 ms |
| auto hash resolves prior custom slug and audio | passed | 4 ms |
| custom mix conflict overwrite and idempotency | passed | 9 ms |
| discovery configuration empty success and failure | passed | 6 ms |
| each audio source can make a shareable mix | passed | 4 ms |
| mix availability taken free and storage failure | passed | 4 ms |
| mix missing invalid and short identifiers | passed | 4 ms |
| mix reads data and reports storage errors | passed | 5 ms |
| mix rejects bad json missing params and silent mix | passed | 2 ms |
| mix write and index failures | passed | 4 ms |
| options all endpoints | passed | 2 ms |
| playlist owner private keys and conflicts | passed | 7 ms |
| playlist storage failure paths | passed | 6 ms |
| playlist validation | passed | 4 ms |
| recent mix order limit missing audio and corrupt metadata | passed | 6 ms |
| tts validation conditional cache and parameter forms | passed | 21 ms |
| allowed origins and rejected hosts | passed | 1 ms |
| audio headers and slug normalisation | passed | 5 ms |
| blob client initialisation handles unconfigured and failures | passed | 4 ms |
| tokens authenticate slug and enforce time windows | passed | 1 ms |
test_origins.pyBackend behaviour · 4 tests4 passed
| Test case | Result | Duration |
|---|---|---|
| allows first party domains and same deployment | passed | <1 ms |
| referer fallback does not override untrusted origin | passed | <1 ms |
| rejects non http sources and embedded credentials | passed | <1 ms |
| rejects suffix lookalikes and unrelated azure tenants | passed | <1 ms |
test_tts.pyBackend behaviour · 8 tests8 passed
| Test case | Result | Duration |
|---|---|---|
| azure requires configuration | passed | 2 ms |
| azure session is reused within a loop | passed | 36 ms |
| azure ssml escapes text and attributes | passed | 1 ms |
| cache avoids provider and refresh failure uses cache | passed | 19 ms |
| failure and empty audio are unavailable | passed | 6 ms |
| first play caches under azure prefix without expiry | passed | 10 ms |
| outage returns 503 | passed | 9 ms |
| success | passed | 4 ms |
No tests match your search. Try another term or result filter.
Quality checks & open work
Automated success and remaining validation, side by side.
309 passed, 0 failed, 0 skipped.
39 passed, 0 failed, 0 skipped.
Astro and TypeScript checks completed successfully.
Listening quality, device narration permissions, headphones and physical surround speakers need manual checks.
These tests simulate provider and storage responses. They do not monitor the public narration service or cloud uptime.
Browser verification Separate capture & UI runs
Guide screenshots: . Report interactions: . These checks run separately from the 348 unit and integration tests above.
| Browser check | Result | Duration |
|---|---|---|
| Soundscape controls are visible | passed | 231 ms |
| Story panel opens with narration controls | passed | 166 ms |
| Playlist drawer opens and closes | passed | 417 ms |
| Sleep timer panel opens | passed | 194 ms |
| Export progress updates the share label (simulated rendering) | passed | 65 ms |
| Shared audio handoff stops audio and sends the narration stop event | passed | 5 ms |
| Report route loads with measured test and coverage results | passed | 1105 ms |
| Test search filters results and shows an empty state | passed | 32 ms |
| Status filter identifies a run with no failed tests | passed | 11 ms |
| File coverage expands with measured source paths | passed | 662 ms |
| Print mode expands report details | passed | 653 ms |
| Help guide loads all four full-size screenshots | passed | 1119 ms |
| Report and help guides fit a narrow mobile viewport | passed | 1564 ms |
| Report has no browser runtime errors | passed | 1 ms |
Browser checks use Chromium with simulated user interaction. They do not replace listening checks on real devices. Download browser outcomes.
A little guidance. A calmer start.
Walk through the real interface with illustrated help guides.
Measured, with context.
What the numbers mean
Line coverage counts executed lines. Branch coverage measures paths through decisions. Frontend and backend percentages use different instrumentation and are reported separately.
The results are a build-time snapshot, not a live status monitor. Source revision identifies the base commit; the run can include uncommitted working changes.
What this run cannot prove
- Unit and integration tests use simulated browser APIs and mocked cloud services.
- Coverage measures executed code, not correctness or a guarantee of reliability.
- Real device speech, physical surround output and every mobile/browser combination require separate manual checks.
- Browser screenshots document the captured interface; they do not certify audio quality or production uptime.
Reproduce this report
Install the project dependencies and api/requirements-dev.txt, then run npm run test:report. npm run build refreshes the report before building the site. Browser guide screenshots are captured separately with npm run test:screenshots against a running local site.
Only sanitised test names, relative source paths and aggregate coverage are published. Runner logs and raw instrumentation remain local.
Download this run as JSON ↓
