Skip to content

Testing Guide

SkySend uses Vitest for unit and integration testing.

Running Tests

bash
# Run all tests
pnpm test

# Run tests for a specific package
cd packages/crypto && pnpm test
cd apps/server && pnpm test

Test Structure

Crypto Tests (packages/crypto/tests/)

FileTests
keychain.test.tsSecret/salt generation, HKDF key derivation, token computation
ece.test.tsStreaming encryption/decryption, nonce handling, size calculation
metadata.test.tsMetadata encryption/decryption, schema validation
password.test.tsArgon2id/PBKDF2 key derivation, password protection XOR
util.test.tsBase64url encoding, constant-time comparison, byte utilities
integration.test.tsFull encrypt-decrypt roundtrip

Server Tests (apps/server/tests/)

FileTests
routes.test.tsAll API route handlers
db.test.tsDatabase operations
storage.test.tsFilesystem storage layer
cleanup.test.tsExpired upload cleanup
config.test.tsEnvironment variable parsing and validation
rate-limit.test.tsRate limiter behavior
quota.test.tsUpload quota enforcement

Writing Tests

Conventions

  • Test files are named *.test.ts
  • Tests are placed in a tests/ directory next to the source
  • Use describe blocks to group related tests
  • Use it or test for individual test cases
  • Prefer expect assertions

Example

typescript
import { describe, it, expect } from 'vitest'
import { generateSecret, SALT_LENGTH } from '@skysend/crypto'

describe('generateSecret', () => {
  it('should generate 32 bytes', () => {
    const secret = generateSecret()
    expect(secret).toBeInstanceOf(Uint8Array)
    expect(secret.byteLength).toBe(32)
  })

  it('should generate unique values', () => {
    const a = generateSecret()
    const b = generateSecret()
    expect(a).not.toEqual(b)
  })
})

Test Helpers

The server tests use a shared helpers.ts file that provides:

  • Test database setup/teardown
  • Pre-configured Hono app instances
  • Helper functions for creating test uploads