Files

119 lines
3.6 KiB
Python

"""partner 集成测试。"""
import pytest
from model_bakery import baker
from rest_framework.test import APIClient
from rest_framework_simplejwt.tokens import RefreshToken
from apps.partner.models import Customer, Supplier
@pytest.fixture
def auth_client(db, user, tenant):
c = APIClient()
refresh = RefreshToken.for_user(user)
c.credentials(
HTTP_AUTHORIZATION=f"Bearer {refresh.access_token}",
HTTP_X_TENANT_ID=tenant.code,
)
return c
@pytest.fixture
def anon(db):
return APIClient()
@pytest.mark.django_db
def test_create_customer(auth_client, tenant):
resp = auth_client.post(
"/api/v1/partner/customers/",
{"code": "C001", "name": "客户A", "kind": "company", "phone": "13800138000"},
format="json",
)
assert resp.status_code == 201, resp.content
assert resp.json()["code"] == "C001"
@pytest.mark.django_db
def test_list_customers(auth_client, tenant):
baker.make(Customer, tenant=tenant, code="C001", name="客户1")
baker.make(Customer, tenant=tenant, code="C002", name="客户2")
resp = auth_client.get("/api/v1/partner/customers/")
assert resp.status_code == 200
assert resp.json()["count"] == 2
@pytest.mark.django_db
def test_search_customer_by_name(auth_client, tenant):
baker.make(Customer, tenant=tenant, code="C001", name="苹果公司")
baker.make(Customer, tenant=tenant, code="C002", name="香蕉公司")
resp = auth_client.get("/api/v1/partner/customers/?search=苹果")
assert resp.json()["count"] == 1
@pytest.mark.django_db
def test_customer_tenant_isolation(auth_client, tenant, other_tenant):
baker.make(Customer, tenant=other_tenant, code="OTHER_C1")
baker.make(Customer, tenant=tenant, code="MY_C1")
resp = auth_client.get("/api/v1/partner/customers/")
codes = {c["code"] for c in resp.json()["results"]}
assert "MY_C1" in codes
assert "OTHER_C1" not in codes
@pytest.mark.django_db
def test_create_supplier(auth_client, tenant):
resp = auth_client.post(
"/api/v1/partner/suppliers/",
{"code": "S001", "name": "供应商A", "phone": "13900139000"},
format="json",
)
assert resp.status_code == 201, resp.content
assert resp.json()["code"] == "S001"
@pytest.mark.django_db
def test_create_price_level(auth_client, tenant):
resp = auth_client.post(
"/api/v1/partner/price-levels/",
{"code": "VIP1", "name": "一级VIP", "discount_rate": "0.9000"},
format="json",
)
assert resp.status_code == 201
@pytest.mark.django_db
def test_anon_cannot_access(anon, tenant):
anon.credentials(HTTP_X_TENANT_ID=tenant.code)
resp = anon.get("/api/v1/partner/customers/")
assert resp.status_code == 401
@pytest.mark.django_db
def test_contact_crud(auth_client, tenant):
# 新建(无挂靠)
resp = auth_client.post(
"/api/v1/partner/contacts/",
{"name": "张三", "phone": "13800138000", "title": "采购"},
format="json",
)
assert resp.status_code == 201, resp.content
cid = resp.json()["id"]
# 编辑
resp = auth_client.patch(
f"/api/v1/partner/contacts/{cid}/",
{"title": "采购经理"},
format="json",
)
assert resp.status_code == 200, resp.content
assert resp.json()["title"] == "采购经理"
# 列表可见
resp = auth_client.get("/api/v1/partner/contacts/")
assert resp.status_code == 200
assert resp.json()["count"] == 1
# 删除
resp = auth_client.delete(f"/api/v1/partner/contacts/{cid}/")
assert resp.status_code in (200, 202, 204), resp.content