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>
173 lines
4.2 KiB
Markdown
173 lines
4.2 KiB
Markdown
---
|
|
status: pending
|
|
priority: p2
|
|
issue_id: "010"
|
|
tags: [testing, helpers, refactoring, vendors, dry]
|
|
dependencies: []
|
|
---
|
|
|
|
# Replace Custom create-vendor Helper with test-vendor from util.clj
|
|
|
|
## Problem Statement
|
|
|
|
The vendors_test.clj defines a custom `create-vendor` helper (lines 18-25) that duplicates functionality already provided by `test-vendor` in `integration/util.clj`. This:
|
|
- Violates DRY principle
|
|
- Creates maintenance burden (two sources of truth)
|
|
- May diverge over time
|
|
|
|
## Findings
|
|
|
|
**From architecture-strategist and kieran-rails-reviewer:**
|
|
|
|
**Current custom helper (lines 18-25):**
|
|
```clojure
|
|
(defn create-vendor
|
|
"Create a vendor with a unique temp id"
|
|
[name & {:as attrs}]
|
|
(merge
|
|
{:db/id (str "vendor-" (java.util.UUID/randomUUID))
|
|
:vendor/name name
|
|
:vendor/default-account "test-account-id"}
|
|
attrs))
|
|
```
|
|
|
|
**Existing utility (util.clj lines 41-44):**
|
|
```clojure
|
|
(defn test-vendor [& kwargs]
|
|
(apply assoc {:db/id "vendor-id"
|
|
:vendor/name "Vendorson"
|
|
:vendor/default-account "test-account-id"}
|
|
kwargs))
|
|
```
|
|
|
|
**Usage comparison:**
|
|
```clojure
|
|
;; Current (vendors_test.clj):
|
|
(create-vendor "Test Vendor 1")
|
|
|
|
;; Could be (using test-vendor):
|
|
(test-vendor :vendor/name "Test Vendor 1")
|
|
```
|
|
|
|
**Note:** The only difference is `create-vendor` generates unique IDs while `test-vendor` uses static ID. For unique IDs, can use:
|
|
```clojure
|
|
(assoc (test-vendor :vendor/name "Test") :db/id (str "vendor-" (UUID/randomUUID)))
|
|
```
|
|
|
|
## Proposed Solutions
|
|
|
|
### Option A: Use test-vendor Directly (Recommended)
|
|
**Effort:** Small (15 minutes)
|
|
**Risk:** Low
|
|
|
|
Remove `create-vendor` and use `test-vendor` with assoc for unique IDs:
|
|
```clojure
|
|
;; Instead of:
|
|
(setup-test-data [(create-vendor "Test Vendor 1")])
|
|
|
|
;; Use:
|
|
(setup-test-data [(test-vendor :vendor/name "Test Vendor 1")])
|
|
|
|
;; For unique IDs:
|
|
(setup-test-data [(assoc (test-vendor :vendor/name "Test Vendor 1")
|
|
:db/id (str "vendor-" (UUID/randomUUID)))])
|
|
```
|
|
|
|
**Pros:**
|
|
- Single source of truth
|
|
- Follows existing util.clj pattern
|
|
- Removes duplication
|
|
|
|
**Cons:**
|
|
- More verbose for unique ID cases
|
|
- Need to import UUID
|
|
|
|
### Option B: Enhance test-vendor in util.clj
|
|
**Effort:** Small (10 minutes)
|
|
**Risk:** Low
|
|
|
|
Modify `test-vendor` to auto-generate unique IDs:
|
|
```clojure
|
|
(defn test-vendor [& kwargs]
|
|
(apply assoc {:db/id (str "vendor-" (java.util.UUID/randomUUID))
|
|
:vendor/name "Vendorson"
|
|
:vendor/default-account "test-account-id"}
|
|
kwargs))
|
|
```
|
|
|
|
Then vendors_test.clj simply calls `(test-vendor :vendor/name "Test")`.
|
|
|
|
**Pros:**
|
|
- Improves utility for all test files
|
|
- No local helper needed
|
|
|
|
**Cons:**
|
|
- May break existing tests expecting static ID
|
|
- Requires updating util.clj (affects all tests)
|
|
|
|
### Option C: Create Named Vendor Helper
|
|
**Effort:** Small (5 minutes)
|
|
**Risk:** Low
|
|
|
|
Keep local helper but use test-vendor internally:
|
|
```clojure
|
|
(defn vendor-with-name [name]
|
|
(test-vendor :vendor/name name))
|
|
```
|
|
|
|
**Pros:**
|
|
- Shorter than test-vendor call
|
|
- Uses existing utility
|
|
|
|
**Cons:**
|
|
- Still have local helper
|
|
- Less explicit than using test-vendor directly
|
|
|
|
## Recommended Action
|
|
|
|
**Go with Option A** - use `test-vendor` directly:
|
|
1. Remove `create-vendor` helper
|
|
2. Update all usages to use `test-vendor`
|
|
3. Use `assoc` for unique IDs where needed
|
|
|
|
This follows DRY principle and uses established patterns.
|
|
|
|
## Technical Details
|
|
|
|
**Affected Code:**
|
|
- Lines 18-25: Remove `create-vendor` function
|
|
- Lines 43-44, 58-59, 75-76, 98-101, etc.: Replace usages
|
|
|
|
**Files:**
|
|
- `test/clj/auto_ap/ssr/admin/vendors_test.clj`
|
|
|
|
**Verification:**
|
|
```bash
|
|
lein test auto-ap.ssr.admin.vendors-test
|
|
lein cljfmt check
|
|
```
|
|
|
|
## Acceptance Criteria
|
|
|
|
- [ ] `create-vendor` helper removed
|
|
- [ ] All usages replaced with `test-vendor`
|
|
- [ ] Unique IDs handled with `assoc` where needed
|
|
- [ ] Tests pass
|
|
- [ ] Code formatted with lein cljfmt
|
|
|
|
## Work Log
|
|
|
|
### 2026-02-07 - Initial Creation
|
|
|
|
**By:** Architecture Strategist Agent
|
|
|
|
**Actions:**
|
|
- Identified duplicate helper function
|
|
- Compared with existing test-vendor utility
|
|
- Documented usage patterns
|
|
|
|
**Learnings:**
|
|
- DRY principle violation in test helpers
|
|
- test-vendor already provides same functionality
|
|
- Small duplication can create maintenance burden
|