331 lines
7.2 KiB
Markdown
331 lines
7.2 KiB
Markdown
# 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
|
|
|
|
```bash
|
|
# From project root
|
|
./scripts/dgraph-start.sh
|
|
|
|
# Verify it's running
|
|
curl http://localhost:8080/health
|
|
```
|
|
|
|
### 2. Run Tests
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
./scripts/test-dgraph.sh
|
|
```
|
|
|
|
#### Specific Test File
|
|
|
|
```bash
|
|
CGO_ENABLED=0 go test -v ./pkg/dgraph -run TestSaveEvents
|
|
```
|
|
|
|
#### With Logging
|
|
|
|
```bash
|
|
export TEST_LOG=1
|
|
CGO_ENABLED=0 go test -v ./pkg/dgraph/...
|
|
```
|
|
|
|
#### With Timeout
|
|
|
|
```bash
|
|
CGO_ENABLED=0 go test -v -timeout 10m ./pkg/dgraph/...
|
|
```
|
|
|
|
### Integration Testing
|
|
|
|
Run tests + relay-tester:
|
|
|
|
```bash
|
|
./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
|
|
|
|
```bash
|
|
CGO_ENABLED=0 go test -v ./pkg/dgraph/... 2>&1 | tee test-output.log
|
|
```
|
|
|
|
### Check Dgraph State
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
docker logs dgraph-orly-test -f
|
|
```
|
|
|
|
## Test Failures
|
|
|
|
### "Dgraph server not available"
|
|
|
|
**Cause:** Dgraph is not running
|
|
|
|
**Fix:**
|
|
```bash
|
|
./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
|
|
|
|
```yaml
|
|
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:
|
|
|
|
```bash
|
|
# Badger benchmarks
|
|
go test -bench=. -benchmem ./pkg/database/...
|
|
|
|
# Dgraph benchmarks
|
|
go test -bench=. -benchmem ./pkg/dgraph/...
|
|
```
|
|
|
|
## Related Documentation
|
|
|
|
- [Main Testing Guide](../../scripts/DGRAPH_TESTING.md)
|
|
- [Implementation Status](../../DGRAPH_IMPLEMENTATION_STATUS.md)
|
|
- [Package README](README.md)
|
|
|
|
## 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
|