"""
In-memory stand-in for the NB client in netbox/dc-util-hosts-import.py.
Implements the three methods the target calls on its client -- .one(), .all(),
.create() -- so the REAL main()/preflight can be driven end-to-end without a live
server. Injected at the get_nb() seam, exactly as tests/dc-rack-mgmt-import/ does.
FIDELITY. .one() issues GET ...?<filter>&limit=1 and takes results[0] -- single-match
by construction, returns the first record whose fields equal the filter, or None. .all()
returns every record on a path (optionally filtered), mirroring the target's limit=1000
list read. .create() records every write so a test can assert a rejected/dry run wrote
NOTHING. The store is keyed by path, so ipam/ip-ranges and ipam/ip-addresses both work.
"""
from __future__ import annotations
class FakeNB:
def __init__(self, ip_ranges=(), ip_addresses=()):
self.store = {
"ipam/ip-ranges": [dict(r) for r in ip_ranges],
"ipam/ip-addresses": [dict(a) for a in ip_addresses],
}
self.creates = [] # (path, payload) for every .create() -- the write ledger
self._next_id = 2000
def one(self, path, **flt):
for rec in self.store.get(path, []):
if all(str(rec.get(k)) == str(v) for k, v in flt.items()):
return rec
return None
def all(self, path, **flt):
out = []
for rec in self.store.get(path, []):
if all(str(rec.get(k)) == str(v) for k, v in flt.items()):
out.append(rec)
return out
def create(self, path, payload):
self.creates.append((path, dict(payload)))
rec = dict(payload)
rec["id"] = self._next_id
self._next_id += 1
self.store.setdefault(path, []).append(rec)
return rec