308 lines
8.6 KiB
Markdown
308 lines
8.6 KiB
Markdown
# Phase 0: Testing & Server Behavior Validation
|
|
|
|
## Overview
|
|
|
|
This document outlines the complete Phase 0 plan for testing Linkding server behavior before redesigning the LinkdingSync extension. The goal is to gather critical information about:
|
|
|
|
1. **API Key Isolation**: Do API keys provide bookmark isolation, or is the user account the only isolation boundary?
|
|
2. **Conflict Resolution**: How does Linkding handle same URL in different contexts (paths, notes)?
|
|
3. **Delete Behavior**: Does deletion via one API key affect bookmarks created by other keys?
|
|
4. **Bundle Tag Filtering**: How do bundles act as filters for bookmark queries?
|
|
|
|
## Current Status
|
|
|
|
| Item | Status |
|
|
|------|--------|
|
|
| Review extension codebase | ✅ Complete |
|
|
| Review Linkding source code | ✅ Complete |
|
|
| Analyze TODOs.txt findings | ✅ Complete |
|
|
| Create test scenarios doc | ✅ Complete |
|
|
| Create test runner script | ✅ Complete |
|
|
| **Execute tests** | ⏳ Pending |
|
|
| **Finalize design** | ⏳ Pending |
|
|
|
|
---
|
|
|
|
## Prerequisites
|
|
|
|
### 1. Create Test User Accounts
|
|
|
|
You need to create **2 user accounts** on your Linkding instance:
|
|
|
|
```
|
|
user_work - For work-related bookmarks
|
|
user_personal - For personal bookmarks
|
|
```
|
|
|
|
### 2. Create API Keys
|
|
|
|
For each user, create **at least 2 API keys** (one per bundle):
|
|
|
|
| User | Key Purpose | Example Name |
|
|
|------|-------------|--------------|
|
|
| user_work | Work bundle access | `user_work_key_1` |
|
|
| user_work | Work bundle access | `user_work_key_2` |
|
|
| user_personal | Personal bundle access | `user_personal_key_1` |
|
|
| user_personal | Personal bundle access | `user_personal_key_2` |
|
|
|
|
**How to create API keys**:
|
|
1. Go to Linkding settings → Advanced
|
|
2. Click "Create new token"
|
|
3. Give it a descriptive name (e.g., "work-bundle-1")
|
|
4. Copy the generated key (it won't be shown again)
|
|
|
|
### 3. Create Bundles
|
|
|
|
Create bundles for filtering:
|
|
|
|
| Bundle Name | Purpose |
|
|
|-------------|---------|
|
|
| `work` | Filter work bookmarks |
|
|
| `personal` | Filter personal bookmarks |
|
|
|
|
### 4. Firefox Configuration
|
|
|
|
#### Option A: Single Firefox Profile with Multiple API Keys
|
|
|
|
Create a Firefox profile that can hold multiple API keys for testing. This allows:
|
|
- Easy switching between work/personal contexts
|
|
- Running automated tests via DevTools console
|
|
|
|
#### Option B: Separate Firefox Profiles
|
|
|
|
Create two separate Firefox profiles:
|
|
- `work-profile` - Configured with work API key
|
|
- `personal-profile` - Configured with personal API key
|
|
|
|
This is simpler but requires switching profiles between tests.
|
|
|
|
---
|
|
|
|
## Test Execution Instructions
|
|
|
|
### Step 1: Load Test Runner
|
|
|
|
1. Open Firefox
|
|
2. Navigate to your Linkding settings page (any page works)
|
|
3. Open DevTools (press `F12`)
|
|
4. Go to the **Console** tab
|
|
5. Copy the entire contents of `test-runner.js`
|
|
6. Paste into the console (Ctrl+Shift+V)
|
|
7. Press Enter
|
|
|
|
You should see:
|
|
```
|
|
LinkdingSync Test Runner loaded successfully
|
|
```
|
|
|
|
### Step 2: Configure Credentials
|
|
|
|
In the console, modify the `CONFIG` object:
|
|
|
|
```javascript
|
|
const CONFIG = {
|
|
serverUrl: 'https://links.blabber1565.com',
|
|
workApiKey: 'your_work_api_key_here', // Paste API key
|
|
personalApiKey: 'your_personal_api_key_here',
|
|
workUser: 'user_work',
|
|
personalUser: 'user_personal',
|
|
workBundle: 'work',
|
|
personalBundle: 'personal',
|
|
cleanupAfterTests: true
|
|
};
|
|
```
|
|
|
|
**Security Note**:
|
|
- API keys are stored in the Firefox session (cleared when Firefox closes)
|
|
- Consider creating a separate `.creds.txt` file for manual reference if needed
|
|
|
|
### Step 3: Run Tests
|
|
|
|
Execute the test suite:
|
|
|
|
```javascript
|
|
runTestSuite()
|
|
```
|
|
|
|
This will run all 6 test scenarios and display results in the console.
|
|
|
|
### Step 4: Analyze Results
|
|
|
|
Each test will output:
|
|
- Setup information
|
|
- API responses
|
|
- **Result analysis** with ✓ or ✗ indicators
|
|
|
|
Example output:
|
|
```
|
|
=== Scenario 1: Same URL, Different API Keys, Same User ===
|
|
✓ Created: ID=123, URL=https://example.com
|
|
✓ Created: ID=456, URL=https://example.com
|
|
|
|
Results:
|
|
Bookmark 1 ID: 123
|
|
Bookmark 2 ID: 456
|
|
✅ RESULT: Different bookmark IDs - API keys provide isolation
|
|
```
|
|
|
|
### Step 5: Cleanup (Optional)
|
|
|
|
After tests complete, clean up test bookmarks:
|
|
|
|
```javascript
|
|
cleanup()
|
|
```
|
|
|
|
Or disable automatic cleanup in CONFIG:
|
|
|
|
```javascript
|
|
cleanupAfterTests: false
|
|
```
|
|
|
|
---
|
|
|
|
## Expected Test Outcomes
|
|
|
|
### Test 1: API Key Isolation
|
|
**Possible Results:**
|
|
- **Same ID**: API keys don't provide isolation - user account is the only boundary
|
|
- **Different IDs**: API keys provide isolation within same user
|
|
|
|
**Decision Impact**:
|
|
- If keys don't isolate → Use separate users for work/personal isolation
|
|
- If keys do isolate → Can use same user with different API keys
|
|
|
|
### Test 2: Cross-User Visibility
|
|
**Possible Results:**
|
|
- **User B sees User A's bookmarks**: Sharing enabled or same underlying user
|
|
- **User B cannot see User A's bookmarks**: Proper isolation
|
|
|
|
**Decision Impact**:
|
|
- Need separate users with sharing disabled for true isolation
|
|
|
|
### Test 3: Path Conflict Resolution
|
|
**Possible Results:**
|
|
- **Same ID**: Server merges by URL, last-write-wins for path/notes
|
|
- **Different IDs**: Server creates separate bookmarks
|
|
|
|
**Decision Impact**:
|
|
- If merges → Need path merge strategy (keep both, prompt user, etc.)
|
|
- If separate → Can use duplicate bookmarks for different contexts
|
|
|
|
### Test 4: Title/Description Merge
|
|
**Possible Results:**
|
|
- **Last-write-wins**: Most recent update wins
|
|
- **Merge**: Both values combined somehow
|
|
- **No conflict**: Different titles preserved
|
|
|
|
**Decision Impact**:
|
|
- Determine merge strategy for conflict resolution
|
|
|
|
### Test 5: Delete Propagation
|
|
**Possible Results:**
|
|
- **Propagates**: Deleting via one key deletes all
|
|
- **Doesn't propagate**: Separate bookmarks per key
|
|
|
|
**Decision Impact:**
|
|
- Aligns with Test 3 results
|
|
|
|
### Test 6: Bundle Tag Filtering
|
|
**Possible Results:**
|
|
- **Works**: Tags filter bookmarks by tag
|
|
- **Doesn't work**: Tags don't provide isolation
|
|
|
|
**Decision Impact:**
|
|
- Bundle tags can provide logical separation
|
|
|
|
---
|
|
|
|
## Test Results Analysis Template
|
|
|
|
After running tests, document results in `docs/test-results.md`:
|
|
|
|
```markdown
|
|
# Test Results
|
|
|
|
## Test 1: API Key Isolation
|
|
- **Result**: [same/different] IDs
|
|
- **Conclusion**: API keys [do/don't] provide isolation
|
|
- **Implication**: Need [separate users OR same user strategy]
|
|
|
|
## Test 2: Cross-User Visibility
|
|
- **Result**: User B [can/cannot] see User A's bookmarks
|
|
- **Conclusion**: Sharing is [enabled/disabled]
|
|
- **Implication**: [Use different users or different settings]
|
|
|
|
## Test 3: Path Conflict Resolution
|
|
- **Result**: [same/different] IDs
|
|
- **Conclusion**: Server [merges/creates separate] bookmarks
|
|
- **Implication**: [Merge paths OR keep separate]
|
|
|
|
## Test 4: Title/Description Conflict
|
|
- **Result**: [last-write-wins/merge/no-conflict]
|
|
- **Conclusion**: Server [uses last-write/merges/doesn't conflict]
|
|
- **Implication**: [Strategy for conflict resolution]
|
|
|
|
## Test 5: Delete Propagation
|
|
- **Result**: Delete [propagated/didn't propagate]
|
|
- **Conclusion**: Deletion [affects all OR affects specific]
|
|
- **Implication**: [Delete strategy]
|
|
|
|
## Test 6: Bundle Tag Filtering
|
|
- **Result**: Bundle tags [work/don't work]
|
|
- **Conclusion**: Tags [provide/isolate] bookmarks
|
|
- **Implication**: [Use tags OR use users]
|
|
|
|
## Final Strategy
|
|
Based on results:
|
|
- [User isolation approach]
|
|
- [Conflict resolution strategy]
|
|
- [Sync behavior]
|
|
```
|
|
|
|
---
|
|
|
|
## Next Steps After Phase 0
|
|
|
|
Once tests complete:
|
|
|
|
1. **Analyze Results**: Review test outputs and document in `test-results.md`
|
|
2. **Finalize Design**: Create new `design.md` with confirmed behaviors
|
|
3. **Redesign Extension**: Implement new architecture based on test findings
|
|
4. **Create Tests**: Write unit tests in `tests/` directory
|
|
5. **Implement Features**: Add UI improvements and scheduled sync
|
|
6. **Document**: Update README.md and API docs
|
|
|
|
---
|
|
|
|
## Files Created
|
|
|
|
| File | Purpose |
|
|
|------|---------|
|
|
| `docs/phase0-test-scenarios.md` | Detailed test scenarios |
|
|
| `test-runner.js` | Automated test execution script |
|
|
| `docs/phase0-plan.md` | This document |
|
|
|
|
---
|
|
|
|
## Questions for You
|
|
|
|
Before you create the test accounts and run tests:
|
|
|
|
1. **Firefox Setup**: Which option do you prefer?
|
|
- Single profile with multiple API keys (more complex, more flexible)
|
|
- Separate profiles (simpler, less flexible)
|
|
|
|
2. **API Key Count**: Do you want to create:
|
|
- 2 API keys per user (minimal for testing)
|
|
- 4 API keys per user (more scenarios)
|
|
|
|
3. **Bundles**: Should we create:
|
|
- 2 bundles (`work`, `personal`)
|
|
- 4 bundles (more granular)
|
|
|
|
4. **Test Execution**: Will you run:
|
|
- All tests at once (`runTestSuite()`)
|
|
- Individual tests as you discover issues
|
|
|
|
Let me know, and I can adjust the test runner accordingly. Once you're ready to create the test accounts, just let me know and I'll provide final instructions. |