Files
next.orly.dev/pkg/dgraph/TESTING.md

7.2 KiB

Dgraph Test Suite

This directory contains a comprehensive test suite for the dgraph database implementation, mirroring all tests from the badger implementation to ensure feature parity.

Test Files

  • testmain_test.go - Test configuration (logging, setup)
  • helpers_test.go - Helper functions for test database setup/teardown
  • save-event_test.go - Event storage tests
  • query-events_test.go - Event query tests

Quick Start

1. Start Dgraph Server

# From project root
./scripts/dgraph-start.sh

# Verify it's running
curl http://localhost:8080/health

2. Run Tests

# Run all dgraph tests
./scripts/test-dgraph.sh

# Or run manually
export ORLY_DGRAPH_URL=localhost:9080
CGO_ENABLED=0 go test -v ./pkg/dgraph/...

# Run specific test
CGO_ENABLED=0 go test -v -run TestSaveEvents ./pkg/dgraph

Test Coverage

Event Storage Tests (save-event_test.go)

TestSaveEvents

  • Loads ~100 events from examples.Cache
  • Saves all events chronologically
  • Verifies no errors during save
  • Reports performance metrics

TestDeletionEventWithETagRejection

  • Creates a regular event
  • Attempts to save deletion event with e-tag
  • Verifies deletion events with e-tags are rejected

TestSaveExistingEvent

  • Saves an event
  • Attempts to save same event again
  • Verifies duplicate events are rejected

Event Query Tests (query-events_test.go)

TestQueryEventsByID

  • Queries event by exact ID match
  • Verifies single result returned
  • Verifies correct event retrieved

TestQueryEventsByKind

  • Queries events by kind (e.g., kind 1)
  • Verifies all results have correct kind
  • Tests filtering logic

TestQueryEventsByAuthor

  • Queries events by author pubkey
  • Verifies all results from correct author
  • Tests author filtering

TestReplaceableEventsAndDeletion

  • Creates replaceable event (kind 0)
  • Creates newer version
  • Verifies only newer version returned in general queries
  • Creates deletion event
  • Verifies deleted event not returned
  • Tests replaceable event logic and deletion

TestParameterizedReplaceableEventsAndDeletion

  • Creates parameterized replaceable event (kind 30000+)
  • Adds d-tag
  • Creates deletion event with e-tag
  • Verifies deleted event not returned
  • Tests parameterized replaceable logic

TestQueryEventsByTimeRange

  • Queries events by since/until timestamps
  • Verifies all results within time range
  • Tests temporal filtering

TestQueryEventsByTag

  • Finds event with tags
  • Queries by tag key/value
  • Verifies all results have the tag
  • Tests tag filtering logic

TestCountEvents

  • Counts all events
  • Counts events by kind filter
  • Verifies correct counts returned
  • Tests counting functionality

Test Helpers

setupTestDB(t *testing.T)

Creates a test dgraph database:

  1. Checks dgraph availability - Skips test if server not running
  2. Creates temp directory - For metadata storage
  3. Initializes dgraph client - Connects to server
  4. Drops all data - Starts with clean slate
  5. Loads test events - From examples.Cache (~100 events)
  6. Sorts chronologically - Ensures addressable events processed in order
  7. Saves all events - Populates test database

Returns: (*D, []*event.E, context.Context, context.CancelFunc, string)

cleanupTestDB(t, db, cancel, tempDir)

Cleans up after tests:

  • Closes database connection
  • Cancels context
  • Removes temp directory

skipIfDgraphNotAvailable(t *testing.T)

Checks if dgraph is running and skips test if not available.

Running Tests

Prerequisites

  1. Dgraph Server - Must be running before tests
  2. Go 1.21+ - For running tests
  3. CGO_ENABLED=0 - For pure Go build

Test Execution

All Tests

./scripts/test-dgraph.sh

Specific Test File

CGO_ENABLED=0 go test -v ./pkg/dgraph -run TestSaveEvents

With Logging

export TEST_LOG=1
CGO_ENABLED=0 go test -v ./pkg/dgraph/...

With Timeout

CGO_ENABLED=0 go test -v -timeout 10m ./pkg/dgraph/...

Integration Testing

Run tests + relay-tester:

./scripts/test-dgraph.sh --relay-tester

This will:

  1. Run all dgraph package tests
  2. Start ORLY with dgraph backend
  3. Run relay-tester against ORLY
  4. Report results

Test Data

Tests use pkg/encoders/event/examples.Cache which contains:

  • ~100 real Nostr events
  • Text notes (kind 1)
  • Profile metadata (kind 0)
  • Various other kinds
  • Events with tags, references, mentions
  • Multiple authors and timestamps

This ensures tests cover realistic scenarios.

Debugging Tests

View Test Output

CGO_ENABLED=0 go test -v ./pkg/dgraph/... 2>&1 | tee test-output.log

Check Dgraph State

# View data via Ratel UI
open http://localhost:8000

# Query via HTTP
curl -X POST localhost:8080/query -d '{
  events(func: type(Event), first: 10) {
    uid
    event.id
    event.kind
    event.created_at
  }
}'

Enable Dgraph Logging

docker logs dgraph-orly-test -f

Test Failures

"Dgraph server not available"

Cause: Dgraph is not running

Fix:

./scripts/dgraph-start.sh

Connection Timeouts

Cause: Dgraph server overloaded or network issues

Fix:

  • Increase test timeout: go test -timeout 20m
  • Check dgraph resources: docker stats dgraph-orly-test
  • Restart dgraph: docker restart dgraph-orly-test

Schema Errors

Cause: Schema conflicts or version mismatch

Fix:

  • Drop all data: Tests call dropAll() automatically
  • Check dgraph version: docker exec dgraph-orly-test dgraph version

Test Hangs

Cause: Deadlock or infinite loop

Fix:

  • Send SIGQUIT: kill -QUIT <test-pid>
  • View goroutine dump
  • Check dgraph logs

Continuous Integration

GitHub Actions Example

name: Dgraph Tests

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest

    services:
      dgraph:
        image: dgraph/standalone:latest
        ports:
          - 8080:8080
          - 9080:9080
        options: >-
          --health-cmd "curl -f http://localhost:8080/health"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    steps:
      - uses: actions/checkout@v3

      - name: Set up Go
        uses: actions/setup-go@v4
        with:
          go-version: '1.21'

      - name: Run dgraph tests
        env:
          ORLY_DGRAPH_URL: localhost:9080
        run: |
          CGO_ENABLED=0 go test -v -timeout 10m ./pkg/dgraph/...

Performance Benchmarks

Compare with badger:

# Badger benchmarks
go test -bench=. -benchmem ./pkg/database/...

# Dgraph benchmarks
go test -bench=. -benchmem ./pkg/dgraph/...

Contributing

When adding new tests:

  1. Mirror badger tests - Ensure feature parity
  2. Use test helpers - setupTestDB() and cleanupTestDB()
  3. Skip if unavailable - Call skipIfDgraphNotAvailable(t)
  4. Clean up resources - Always defer cleanupTestDB()
  5. Test chronologically - Sort events by timestamp for addressable events
  6. Verify behavior - Don't just check for no errors, verify correctness