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:
- Checks dgraph availability - Skips test if server not running
- Creates temp directory - For metadata storage
- Initializes dgraph client - Connects to server
- Drops all data - Starts with clean slate
- Loads test events - From examples.Cache (~100 events)
- Sorts chronologically - Ensures addressable events processed in order
- 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
- Dgraph Server - Must be running before tests
- Go 1.21+ - For running tests
- 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:
- Run all dgraph package tests
- Start ORLY with dgraph backend
- Run relay-tester against ORLY
- 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/...
Related Documentation
Contributing
When adding new tests:
- Mirror badger tests - Ensure feature parity
- Use test helpers - setupTestDB() and cleanupTestDB()
- Skip if unavailable - Call skipIfDgraphNotAvailable(t)
- Clean up resources - Always defer cleanupTestDB()
- Test chronologically - Sort events by timestamp for addressable events
- Verify behavior - Don't just check for no errors, verify correctness