Add recipe-based PoC for CircuitTestCase (#22087)
Add baker_recipes.py files for circuits, dcim, tenancy, and ipam apps with Recipe objects that document model relationships and provide named status variants (active_circuit, planned_circuit, offline_circuit). Convert CircuitTestCase in test_filtersets.py to use recipes instead of bare baker.make() calls. All 127 filterset tests pass. This commit sits alongside the existing baker.make() conversion so reviewers can compare both approaches.
This commit is contained in:
parent
2ce649aa70
commit
e91c8b97e1
|
|
@ -0,0 +1,68 @@
|
||||||
|
from model_bakery.recipe import Recipe, foreign_key, seq
|
||||||
|
|
||||||
|
from circuits.choices import CircuitStatusChoices
|
||||||
|
|
||||||
|
#
|
||||||
|
# Provider
|
||||||
|
#
|
||||||
|
|
||||||
|
provider = Recipe(
|
||||||
|
'circuits.Provider',
|
||||||
|
name=seq('Provider '),
|
||||||
|
slug=seq('provider-'),
|
||||||
|
)
|
||||||
|
|
||||||
|
#
|
||||||
|
# CircuitType
|
||||||
|
#
|
||||||
|
|
||||||
|
circuit_type = Recipe(
|
||||||
|
'circuits.CircuitType',
|
||||||
|
name=seq('Circuit Type '),
|
||||||
|
slug=seq('circuit-type-'),
|
||||||
|
)
|
||||||
|
|
||||||
|
#
|
||||||
|
# ProviderAccount
|
||||||
|
#
|
||||||
|
|
||||||
|
provider_account = Recipe(
|
||||||
|
'circuits.ProviderAccount',
|
||||||
|
name=seq('Provider Account '),
|
||||||
|
provider=foreign_key(provider),
|
||||||
|
account=seq('ACCT-'),
|
||||||
|
)
|
||||||
|
|
||||||
|
#
|
||||||
|
# ProviderNetwork
|
||||||
|
#
|
||||||
|
|
||||||
|
provider_network = Recipe(
|
||||||
|
'circuits.ProviderNetwork',
|
||||||
|
name=seq('Provider Network '),
|
||||||
|
provider=foreign_key(provider),
|
||||||
|
)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Circuit
|
||||||
|
#
|
||||||
|
|
||||||
|
circuit = Recipe(
|
||||||
|
'circuits.Circuit',
|
||||||
|
cid=seq('CID-'),
|
||||||
|
provider=foreign_key(provider),
|
||||||
|
type=foreign_key(circuit_type),
|
||||||
|
status=CircuitStatusChoices.STATUS_ACTIVE,
|
||||||
|
)
|
||||||
|
|
||||||
|
active_circuit = circuit.extend(
|
||||||
|
status=CircuitStatusChoices.STATUS_ACTIVE,
|
||||||
|
)
|
||||||
|
|
||||||
|
planned_circuit = circuit.extend(
|
||||||
|
status=CircuitStatusChoices.STATUS_PLANNED,
|
||||||
|
)
|
||||||
|
|
||||||
|
offline_circuit = circuit.extend(
|
||||||
|
status=CircuitStatusChoices.STATUS_OFFLINE,
|
||||||
|
)
|
||||||
|
|
@ -157,117 +157,97 @@ class CircuitTestCase(TestCase, ChangeLoggedFilterSetTests):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpTestData(cls):
|
def setUpTestData(cls):
|
||||||
|
from circuits.baker_recipes import (
|
||||||
# MPTT models: use .save() directly
|
active_circuit,
|
||||||
regions = (
|
offline_circuit,
|
||||||
Region(name='Test Region 1', slug='test-region-1'),
|
planned_circuit,
|
||||||
Region(name='Test Region 2', slug='test-region-2'),
|
provider,
|
||||||
Region(name='Test Region 3', slug='test-region-3'),
|
provider_account,
|
||||||
|
provider_network,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# MPTT models: use .save() directly (baker triggers mptt guard)
|
||||||
|
regions = [Region(name=f'Test Region {i}', slug=f'test-region-{i}') for i in range(1, 4)]
|
||||||
for r in regions:
|
for r in regions:
|
||||||
r.save()
|
r.save()
|
||||||
|
|
||||||
site_groups = (
|
site_groups = [SiteGroup(name=f'Site Group {i}', slug=f'site-group-{i}') for i in range(1, 4)]
|
||||||
SiteGroup(name='Site Group 1', slug='site-group-1'),
|
for sg in site_groups:
|
||||||
SiteGroup(name='Site Group 2', slug='site-group-2'),
|
sg.save()
|
||||||
SiteGroup(name='Site Group 3', slug='site-group-3'),
|
|
||||||
)
|
|
||||||
for site_group in site_groups:
|
|
||||||
site_group.save()
|
|
||||||
|
|
||||||
sites = (
|
tenant_groups = [TenantGroup(name=f'Tenant group {i}', slug=f'tenant-group-{i}') for i in range(1, 4)]
|
||||||
baker.make('dcim.Site', name='Test Site 1', slug='test-site-1', region=regions[0], group=site_groups[0]),
|
for tg in tenant_groups:
|
||||||
baker.make('dcim.Site', name='Test Site 2', slug='test-site-2', region=regions[1], group=site_groups[1]),
|
tg.save()
|
||||||
baker.make('dcim.Site', name='Test Site 3', slug='test-site-3', region=regions[2], group=site_groups[2]),
|
|
||||||
)
|
|
||||||
|
|
||||||
# MPTT models: use .save() directly
|
|
||||||
tenant_groups = (
|
|
||||||
TenantGroup(name='Tenant group 1', slug='tenant-group-1'),
|
|
||||||
TenantGroup(name='Tenant group 2', slug='tenant-group-2'),
|
|
||||||
TenantGroup(name='Tenant group 3', slug='tenant-group-3'),
|
|
||||||
)
|
|
||||||
for tenantgroup in tenant_groups:
|
|
||||||
tenantgroup.save()
|
|
||||||
|
|
||||||
tenants = (
|
|
||||||
baker.make('tenancy.Tenant', name='Tenant 1', slug='tenant-1', group=tenant_groups[0]),
|
|
||||||
baker.make('tenancy.Tenant', name='Tenant 2', slug='tenant-2', group=tenant_groups[1]),
|
|
||||||
baker.make('tenancy.Tenant', name='Tenant 3', slug='tenant-3', group=tenant_groups[2]),
|
|
||||||
)
|
|
||||||
|
|
||||||
circuit_types = baker.make('circuits.CircuitType', _quantity=2)
|
|
||||||
|
|
||||||
providers = baker.make('circuits.Provider', _quantity=3)
|
|
||||||
|
|
||||||
|
# Non-MPTT models: use recipes
|
||||||
|
sites = [
|
||||||
|
baker.make_recipe('dcim.site', region=regions[i], group=site_groups[i])
|
||||||
|
for i in range(3)
|
||||||
|
]
|
||||||
|
tenants = [
|
||||||
|
baker.make_recipe('tenancy.tenant', group=tenant_groups[i])
|
||||||
|
for i in range(3)
|
||||||
|
]
|
||||||
|
circuit_types = baker.make_recipe('circuits.circuit_type', _quantity=2)
|
||||||
|
providers = provider.make(_quantity=3)
|
||||||
provider_accounts = [
|
provider_accounts = [
|
||||||
baker.make('circuits.ProviderAccount', provider=providers[0]),
|
provider_account.make(provider=providers[i])
|
||||||
baker.make('circuits.ProviderAccount', provider=providers[1]),
|
for i in range(3)
|
||||||
baker.make('circuits.ProviderAccount', provider=providers[2]),
|
]
|
||||||
|
provider_networks = provider_network.make(provider=providers[1], _quantity=3)
|
||||||
|
|
||||||
|
# Location is MPTT: use .objects.create()
|
||||||
|
locations = [
|
||||||
|
Location.objects.create(
|
||||||
|
site=sites[i], name=f'Test Location {i + 1}', slug=f'test-location-{i + 1}',
|
||||||
|
status=LocationStatusChoices.STATUS_ACTIVE,
|
||||||
|
)
|
||||||
|
for i in range(2)
|
||||||
]
|
]
|
||||||
|
|
||||||
provider_networks = baker.make('circuits.ProviderNetwork', provider=providers[1], _quantity=3)
|
# Circuits: recipes encode status; test-specific fields passed as overrides
|
||||||
|
circuits = [
|
||||||
locations = (
|
active_circuit.make(
|
||||||
Location.objects.create(
|
|
||||||
site=sites[0], name='Test Location 1', slug='test-location-1',
|
|
||||||
status=LocationStatusChoices.STATUS_ACTIVE,
|
|
||||||
),
|
|
||||||
Location.objects.create(
|
|
||||||
site=sites[1], name='Test Location 2', slug='test-location-2',
|
|
||||||
status=LocationStatusChoices.STATUS_ACTIVE,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
circuits = (
|
|
||||||
baker.make(
|
|
||||||
'circuits.Circuit',
|
|
||||||
provider=providers[0], provider_account=provider_accounts[0],
|
provider=providers[0], provider_account=provider_accounts[0],
|
||||||
tenant=tenants[0], type=circuit_types[0],
|
tenant=tenants[0], type=circuit_types[0],
|
||||||
cid='Test Circuit 1', install_date='2020-01-01', termination_date='2021-01-01',
|
cid='Test Circuit 1', install_date='2020-01-01', termination_date='2021-01-01',
|
||||||
commit_rate=1000, status=CircuitStatusChoices.STATUS_ACTIVE,
|
commit_rate=1000, description='foobar1',
|
||||||
description='foobar1', distance=10, distance_unit=DistanceUnitChoices.UNIT_FOOT,
|
distance=10, distance_unit=DistanceUnitChoices.UNIT_FOOT,
|
||||||
),
|
),
|
||||||
baker.make(
|
active_circuit.make(
|
||||||
'circuits.Circuit',
|
|
||||||
provider=providers[0], provider_account=provider_accounts[0],
|
provider=providers[0], provider_account=provider_accounts[0],
|
||||||
tenant=tenants[0], type=circuit_types[0],
|
tenant=tenants[0], type=circuit_types[0],
|
||||||
cid='Test Circuit 2', install_date='2020-01-02', termination_date='2021-01-02',
|
cid='Test Circuit 2', install_date='2020-01-02', termination_date='2021-01-02',
|
||||||
commit_rate=2000, status=CircuitStatusChoices.STATUS_ACTIVE,
|
commit_rate=2000, description='foobar2',
|
||||||
description='foobar2', distance=20, distance_unit=DistanceUnitChoices.UNIT_METER,
|
distance=20, distance_unit=DistanceUnitChoices.UNIT_METER,
|
||||||
),
|
),
|
||||||
baker.make(
|
planned_circuit.make(
|
||||||
'circuits.Circuit',
|
|
||||||
provider=providers[0], provider_account=provider_accounts[1],
|
provider=providers[0], provider_account=provider_accounts[1],
|
||||||
tenant=tenants[1], type=circuit_types[0],
|
tenant=tenants[1], type=circuit_types[0],
|
||||||
cid='Test Circuit 3', install_date='2020-01-03', termination_date='2021-01-03',
|
cid='Test Circuit 3', install_date='2020-01-03', termination_date='2021-01-03',
|
||||||
commit_rate=3000, status=CircuitStatusChoices.STATUS_PLANNED,
|
commit_rate=3000, distance=30, distance_unit=DistanceUnitChoices.UNIT_METER,
|
||||||
distance=30, distance_unit=DistanceUnitChoices.UNIT_METER,
|
|
||||||
),
|
),
|
||||||
baker.make(
|
planned_circuit.make(
|
||||||
'circuits.Circuit',
|
|
||||||
provider=providers[1], provider_account=provider_accounts[1],
|
provider=providers[1], provider_account=provider_accounts[1],
|
||||||
tenant=tenants[1], type=circuit_types[1],
|
tenant=tenants[1], type=circuit_types[1],
|
||||||
cid='Test Circuit 4', install_date='2020-01-04', termination_date='2021-01-04',
|
cid='Test Circuit 4', install_date='2020-01-04', termination_date='2021-01-04',
|
||||||
commit_rate=4000, status=CircuitStatusChoices.STATUS_PLANNED,
|
commit_rate=4000,
|
||||||
),
|
),
|
||||||
baker.make(
|
offline_circuit.make(
|
||||||
'circuits.Circuit',
|
|
||||||
provider=providers[1], provider_account=provider_accounts[2],
|
provider=providers[1], provider_account=provider_accounts[2],
|
||||||
tenant=tenants[2], type=circuit_types[1],
|
tenant=tenants[2], type=circuit_types[1],
|
||||||
cid='Test Circuit 5', install_date='2020-01-05', termination_date='2021-01-05',
|
cid='Test Circuit 5', install_date='2020-01-05', termination_date='2021-01-05',
|
||||||
commit_rate=5000, status=CircuitStatusChoices.STATUS_OFFLINE,
|
commit_rate=5000,
|
||||||
),
|
),
|
||||||
baker.make(
|
offline_circuit.make(
|
||||||
'circuits.Circuit',
|
|
||||||
provider=providers[1], provider_account=provider_accounts[2],
|
provider=providers[1], provider_account=provider_accounts[2],
|
||||||
tenant=tenants[2], type=circuit_types[1],
|
tenant=tenants[2], type=circuit_types[1],
|
||||||
cid='Test Circuit 6', install_date='2020-01-06', termination_date='2021-01-06',
|
cid='Test Circuit 6', install_date='2020-01-06', termination_date='2021-01-06',
|
||||||
commit_rate=6000, status=CircuitStatusChoices.STATUS_OFFLINE,
|
commit_rate=6000,
|
||||||
),
|
),
|
||||||
)
|
]
|
||||||
|
|
||||||
circuit_terminations = ((
|
circuit_terminations = (
|
||||||
CircuitTermination(circuit=circuits[0], termination=sites[0], term_side='A'),
|
CircuitTermination(circuit=circuits[0], termination=sites[0], term_side='A'),
|
||||||
CircuitTermination(circuit=circuits[0], termination=locations[0], term_side='Z'),
|
CircuitTermination(circuit=circuits[0], termination=locations[0], term_side='Z'),
|
||||||
CircuitTermination(circuit=circuits[1], termination=sites[1], term_side='A'),
|
CircuitTermination(circuit=circuits[1], termination=sites[1], term_side='A'),
|
||||||
|
|
@ -276,7 +256,7 @@ class CircuitTestCase(TestCase, ChangeLoggedFilterSetTests):
|
||||||
CircuitTermination(circuit=circuits[3], termination=provider_networks[0], term_side='A'),
|
CircuitTermination(circuit=circuits[3], termination=provider_networks[0], term_side='A'),
|
||||||
CircuitTermination(circuit=circuits[4], termination=provider_networks[1], term_side='A'),
|
CircuitTermination(circuit=circuits[4], termination=provider_networks[1], term_side='A'),
|
||||||
CircuitTermination(circuit=circuits[5], termination=provider_networks[2], term_side='A'),
|
CircuitTermination(circuit=circuits[5], termination=provider_networks[2], term_side='A'),
|
||||||
))
|
)
|
||||||
for ct in circuit_terminations:
|
for ct in circuit_terminations:
|
||||||
ct.save()
|
ct.save()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
from model_bakery.recipe import Recipe, seq
|
||||||
|
|
||||||
|
#
|
||||||
|
# Site
|
||||||
|
#
|
||||||
|
|
||||||
|
site = Recipe(
|
||||||
|
'dcim.Site',
|
||||||
|
name=seq('Site '),
|
||||||
|
slug=seq('site-'),
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
from model_bakery.recipe import Recipe, foreign_key, seq
|
||||||
|
|
||||||
|
#
|
||||||
|
# RIR
|
||||||
|
#
|
||||||
|
|
||||||
|
rir = Recipe(
|
||||||
|
'ipam.RIR',
|
||||||
|
name=seq('RIR '),
|
||||||
|
slug=seq('rir-'),
|
||||||
|
)
|
||||||
|
|
||||||
|
#
|
||||||
|
# ASN
|
||||||
|
#
|
||||||
|
|
||||||
|
asn = Recipe(
|
||||||
|
'ipam.ASN',
|
||||||
|
asn=seq(64512),
|
||||||
|
rir=foreign_key(rir),
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
from model_bakery.recipe import Recipe, seq
|
||||||
|
|
||||||
|
#
|
||||||
|
# Tenant
|
||||||
|
#
|
||||||
|
|
||||||
|
tenant = Recipe(
|
||||||
|
'tenancy.Tenant',
|
||||||
|
name=seq('Tenant '),
|
||||||
|
slug=seq('tenant-'),
|
||||||
|
)
|
||||||
Loading…
Reference in New Issue