| 1 | import { describe, it, expect } from 'vitest'
|
| 2 | import {
|
| 3 | pearson,
|
| 4 | energySleepBody,
|
| 5 | } from '@app/lib/queue/processors/insights/energySleep'
|
| 6 |
|
| 7 | describe('pearson', () => {
|
| 8 | it('returns 1 for a perfect positive correlation', () => {
|
| 9 | expect(pearson([1, 2, 3], [2, 4, 6])).toBeCloseTo(1, 12)
|
| 10 | })
|
| 11 |
|
| 12 | it('returns -1 for a perfect negative correlation', () => {
|
| 13 | expect(pearson([1, 2, 3], [6, 4, 2])).toBeCloseTo(-1, 12)
|
| 14 | })
|
| 15 |
|
| 16 | it('returns 0 with fewer than two samples', () => {
|
| 17 | expect(pearson([], [])).toBe(0)
|
| 18 | expect(pearson([1], [2])).toBe(0)
|
| 19 | })
|
| 20 |
|
| 21 | it('returns 0 when either axis has zero variance', () => {
|
| 22 | expect(pearson([5, 5, 5], [1, 2, 3])).toBe(0)
|
| 23 | expect(pearson([1, 2, 3], [4, 4, 4])).toBe(0)
|
| 24 | })
|
| 25 |
|
| 26 | it('stays within [-1, 1] for a partial correlation', () => {
|
| 27 | const r = pearson([1, 2, 3, 4, 5], [2, 1, 3, 4, 6])
|
| 28 |
|
| 29 | expect(r).toBeGreaterThanOrEqual(-1)
|
| 30 | expect(r).toBeLessThanOrEqual(1)
|
| 31 | expect(r).toBeCloseTo(0.904, 3)
|
| 32 | })
|
| 33 | })
|
| 34 |
|
| 35 | describe('energySleepBody', () => {
|
| 36 | const limited = ' (dados limitados, continue registrando)'
|
| 37 |
|
| 38 | it('reads a strong positive correlation above 0.6', () => {
|
| 39 | expect(energySleepBody(0.8, 10)).toBe(
|
| 40 | 'Seu sono tem forte impacto positivo na sua energia no dia seguinte.',
|
| 41 | )
|
| 42 | })
|
| 43 |
|
| 44 | it('reads a moderate correlation above 0.3', () => {
|
| 45 | expect(energySleepBody(0.4, 10)).toBe(
|
| 46 | 'Seu sono tem impacto moderado na sua energia no dia seguinte.',
|
| 47 | )
|
| 48 | })
|
| 49 |
|
| 50 | it('reads a negative correlation below -0.3', () => {
|
| 51 | expect(energySleepBody(-0.5, 10)).toBe(
|
| 52 | 'Curiosamente, mais sono está associado a menos energia — vale investigar.',
|
| 53 | )
|
| 54 | })
|
| 55 |
|
| 56 | it('reports no clear relation in the middle band', () => {
|
| 57 | expect(energySleepBody(0, 10)).toBe(
|
| 58 | 'Não encontramos uma relação clara entre seu sono e energia ainda.',
|
| 59 | )
|
| 60 | })
|
| 61 |
|
| 62 | it('falls to the lower band exactly on each threshold', () => {
|
| 63 | expect(energySleepBody(0.6, 10)).toBe(
|
| 64 | 'Seu sono tem impacto moderado na sua energia no dia seguinte.',
|
| 65 | )
|
| 66 | expect(energySleepBody(0.3, 10)).toBe(
|
| 67 | 'Não encontramos uma relação clara entre seu sono e energia ainda.',
|
| 68 | )
|
| 69 | expect(energySleepBody(-0.3, 10)).toBe(
|
| 70 | 'Não encontramos uma relação clara entre seu sono e energia ainda.',
|
| 71 | )
|
| 72 | })
|
| 73 |
|
| 74 | it('appends the low-sample footnote under five pairs', () => {
|
| 75 | expect(energySleepBody(0.8, 3)).toBe(
|
| 76 | 'Seu sono tem forte impacto positivo na sua energia no dia seguinte.' +
|
| 77 | limited,
|
| 78 | )
|
| 79 | })
|
| 80 |
|
| 81 | it('drops the footnote at exactly five pairs', () => {
|
| 82 | expect(energySleepBody(0.8, 4)).toBe(
|
| 83 | 'Seu sono tem forte impacto positivo na sua energia no dia seguinte.' +
|
| 84 | limited,
|
| 85 | )
|
| 86 | expect(energySleepBody(0.8, 5)).toBe(
|
| 87 | 'Seu sono tem forte impacto positivo na sua energia no dia seguinte.',
|
| 88 | )
|
| 89 | })
|
| 90 | })
|