feat(tests): Add comprehensive tests for SSR admin vendors module
Add 8 BDD-style tests for the vendors module covering grid/list operations and vendor merge functionality. Tests follow established patterns from accounts_test.clj and include proper database verification. Tests Implemented: - vendor-grid-loads-with-empty-database - vendor-fetch-ids-returns-correct-structure - vendor-fetch-page-returns-vendors - vendor-hydrate-results-works - vendor-merge-transfers-references - vendor-merge-same-vendor-rejected - vendor-merge-invalid-vendor-handled - vendor-hydration-includes-all-fields Key Implementation Details: - Uses setup-test-data helper with unique temp IDs - Tests focus on public interface (fetch-page, merge-submit) - Follows BDD Given/When/Then pattern - All 8 tests passing (26 assertions) Documentation: - Created implementation plan in docs/plans/ - Documented solution patterns in docs/solutions/ - Created code review todos for future improvements 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
160
todos/009-pending-p2-standardize-temp-id-generation.md
Normal file
160
todos/009-pending-p2-standardize-temp-id-generation.md
Normal file
@@ -0,0 +1,160 @@
|
||||
---
|
||||
status: pending
|
||||
priority: p2
|
||||
issue_id: "009"
|
||||
tags: [testing, patterns, consistency, vendors, datomic]
|
||||
dependencies: []
|
||||
---
|
||||
|
||||
# Standardize Temp ID Generation Pattern in vendors_test.clj
|
||||
|
||||
## Problem Statement
|
||||
|
||||
The vendors test file uses **inconsistent** temp ID generation patterns:
|
||||
1. `(str "vendor-" (java.util.UUID/randomUUID))` in create-vendor helper
|
||||
2. `(str "vendor-" (rand-int 100000))` in test bodies
|
||||
3. `(str "vendor-source-" (rand-int 100000))` for merge tests
|
||||
|
||||
This inconsistency:
|
||||
- Creates confusion about which pattern to use
|
||||
- `rand-int` has collision risk (1 in 100,000 per test)
|
||||
- Makes code harder to maintain
|
||||
|
||||
## Findings
|
||||
|
||||
**Inconsistent patterns identified by pattern-recognition-specialist:**
|
||||
|
||||
**Line 22:**
|
||||
```clojure
|
||||
(defn create-vendor ...
|
||||
{:db/id (str "vendor-" (java.util.UUID/randomUUID)) ...})
|
||||
```
|
||||
|
||||
**Lines 74, 96, 123, 140, 161:**
|
||||
```clojure
|
||||
(let [vendor-temp-id (str "vendor-" (rand-int 100000)) ...])
|
||||
(let [source-temp-id (str "vendor-source-" (rand-int 100000)) ...])
|
||||
```
|
||||
|
||||
**accounts_test.clj pattern:**
|
||||
Uses `(rand-int 100000)` consistently throughout.
|
||||
|
||||
## Proposed Solutions
|
||||
|
||||
### Option A: Standardize on UUID (Recommended)
|
||||
**Effort:** Small (10 minutes)
|
||||
**Risk:** Low
|
||||
|
||||
Replace all `(rand-int 100000)` with `(java.util.UUID/randomUUID)`:
|
||||
```clojure
|
||||
;; Helper function
|
||||
(defn- generate-temp-id [prefix]
|
||||
(str prefix "-" (java.util.UUID/randomUUID)))
|
||||
|
||||
;; Usage
|
||||
(let [vendor-temp-id (generate-temp-id "vendor") ...]
|
||||
(let [source-temp-id (generate-temp-id "vendor-source") ...]
|
||||
```
|
||||
|
||||
**Pros:**
|
||||
- Virtually zero collision probability
|
||||
- Consistent across all tests
|
||||
- UUID is standard for unique IDs
|
||||
|
||||
**Cons:**
|
||||
- Slightly longer IDs (but doesn't matter for tests)
|
||||
- Different from accounts_test.clj pattern
|
||||
|
||||
### Option B: Standardize on rand-int (Matching accounts_test.clj)
|
||||
**Effort:** Small (10 minutes)
|
||||
**Risk:** Low
|
||||
|
||||
Change create-vendor to use rand-int:
|
||||
```clojure
|
||||
(defn create-vendor ...
|
||||
{:db/id (str "vendor-" (rand-int 100000)) ...})
|
||||
```
|
||||
|
||||
**Pros:**
|
||||
- Matches accounts_test.clj exactly
|
||||
- Shorter IDs
|
||||
- Simpler
|
||||
|
||||
**Cons:**
|
||||
- Collision risk (though statistically low)
|
||||
- UUID is more standard for uniqueness
|
||||
|
||||
### Option C: Use Sequential IDs
|
||||
**Effort:** Small (5 minutes)
|
||||
**Risk:** Low
|
||||
|
||||
Use simple sequential pattern:
|
||||
```clojure
|
||||
;; No random generation needed
|
||||
(let [vendor-temp-id "vendor-hydrate-test" ...])
|
||||
```
|
||||
|
||||
**Pros:**
|
||||
- Simplest possible
|
||||
- No collision risk
|
||||
- Self-documenting IDs
|
||||
|
||||
**Cons:**
|
||||
- Different from accounts_test.clj
|
||||
- Tests may fail if run concurrently (same IDs)
|
||||
|
||||
## Recommended Action
|
||||
|
||||
**Go with Option A** - standardize on UUID:
|
||||
1. Create helper function for consistency
|
||||
2. Update all test temp IDs to use UUID
|
||||
3. Update create-vendor helper to use UUID
|
||||
|
||||
This provides the safest pattern with zero collision risk.
|
||||
|
||||
## Technical Details
|
||||
|
||||
**Affected Lines:**
|
||||
- Line 22: create-vendor helper
|
||||
- Lines 74, 96, 97, 123, 140, 161: Test temp IDs
|
||||
|
||||
**Implementation:**
|
||||
```clojure
|
||||
(defn- temp-id [prefix]
|
||||
(str prefix "-" (java.util.UUID/randomUUID)))
|
||||
|
||||
;; Replace all instances:
|
||||
(temp-id "vendor") ; instead of (str "vendor-" (rand-int 100000))
|
||||
(temp-id "vendor-source") ; instead of (str "vendor-source-" (rand-int 100000))
|
||||
(temp-id "vendor-target") ; etc.
|
||||
```
|
||||
|
||||
**Verification:**
|
||||
```bash
|
||||
lein test auto-ap.ssr.admin.vendors-test
|
||||
lein cljfmt check
|
||||
```
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- [ ] Helper function created for temp ID generation
|
||||
- [ ] All tests use consistent UUID-based temp IDs
|
||||
- [ ] create-vendor helper updated
|
||||
- [ ] Tests pass
|
||||
- [ ] Code formatted with lein cljfmt
|
||||
|
||||
## Work Log
|
||||
|
||||
### 2026-02-07 - Initial Creation
|
||||
|
||||
**By:** Pattern Recognition Specialist Agent
|
||||
|
||||
**Actions:**
|
||||
- Identified inconsistent ID generation patterns
|
||||
- Documented all occurrences
|
||||
- Created todo for standardization
|
||||
|
||||
**Learnings:**
|
||||
- accounts_test.clj uses rand-int consistently
|
||||
- UUID provides better collision resistance
|
||||
- Consistency across codebase is important for maintainability
|
||||
Reference in New Issue
Block a user