112 lines
3.6 KiB
Python
112 lines
3.6 KiB
Python
"""
|
|
Base test class for integration tests
|
|
Provides common fixtures and utilities
|
|
"""
|
|
from django.test import TestCase
|
|
from rest_framework.test import APIClient
|
|
from rest_framework import status
|
|
from igny8_core.auth.models import User, Account, Plan, Site, Sector, Industry, IndustrySector, SeedKeyword
|
|
|
|
|
|
class IntegrationTestBase(TestCase):
|
|
"""Base class for integration tests with common fixtures"""
|
|
|
|
def setUp(self):
|
|
"""Set up test fixtures"""
|
|
self.client = APIClient()
|
|
|
|
# Create test plan
|
|
self.plan = Plan.objects.create(
|
|
name="Test Plan",
|
|
slug="test-plan",
|
|
price=0,
|
|
credits_per_month=1000
|
|
)
|
|
|
|
# Create test user first (Account needs owner)
|
|
self.user = User.objects.create_user(
|
|
username='testuser',
|
|
email='test@test.com',
|
|
password='testpass123',
|
|
role='owner'
|
|
)
|
|
|
|
# Create test account with owner
|
|
self.account = Account.objects.create(
|
|
name="Test Account",
|
|
slug="test-account",
|
|
plan=self.plan,
|
|
owner=self.user
|
|
)
|
|
|
|
# Update user to have account
|
|
self.user.account = self.account
|
|
self.user.save()
|
|
|
|
# Create industry and sector
|
|
self.industry = Industry.objects.create(
|
|
name="Test Industry",
|
|
slug="test-industry"
|
|
)
|
|
|
|
self.industry_sector = IndustrySector.objects.create(
|
|
industry=self.industry,
|
|
name="Test Sector",
|
|
slug="test-sector"
|
|
)
|
|
|
|
# Create site
|
|
self.site = Site.objects.create(
|
|
name="Test Site",
|
|
slug="test-site",
|
|
account=self.account,
|
|
industry=self.industry
|
|
)
|
|
|
|
# Create sector (Sector needs industry_sector reference)
|
|
self.sector = Sector.objects.create(
|
|
name="Test Sector",
|
|
slug="test-sector",
|
|
site=self.site,
|
|
account=self.account,
|
|
industry_sector=self.industry_sector
|
|
)
|
|
|
|
# Create seed keyword
|
|
self.seed_keyword = SeedKeyword.objects.create(
|
|
keyword="test keyword",
|
|
industry=self.industry,
|
|
sector=self.industry_sector,
|
|
volume=1000,
|
|
difficulty=50,
|
|
intent="informational"
|
|
)
|
|
|
|
# Authenticate client
|
|
self.client.force_authenticate(user=self.user)
|
|
|
|
# Set account on request (simulating middleware)
|
|
self.client.force_authenticate(user=self.user)
|
|
|
|
def assert_unified_response_format(self, response, expected_success=True):
|
|
"""Assert response follows unified format"""
|
|
self.assertIn('success', response.data)
|
|
self.assertEqual(response.data['success'], expected_success)
|
|
|
|
if expected_success:
|
|
# Success responses should have data or results
|
|
self.assertTrue('data' in response.data or 'results' in response.data)
|
|
else:
|
|
# Error responses should have error
|
|
self.assertIn('error', response.data)
|
|
|
|
def assert_paginated_response(self, response):
|
|
"""Assert response is a paginated response"""
|
|
self.assert_unified_response_format(response, expected_success=True)
|
|
self.assertIn('success', response.data)
|
|
self.assertIn('count', response.data)
|
|
self.assertIn('results', response.data)
|
|
self.assertIn('next', response.data)
|
|
self.assertIn('previous', response.data)
|
|
|