Test Scaffold¶
Base classes and utilities for testing.
Quick Start¶
from htk.test_scaffold.tests import BaseTestCase, BaseWebTestCase
from htk.test_scaffold.utils import create_test_user, create_test_username
class MyTestCase(BaseTestCase):
def setUp(self):
super().setUp()
self.user = create_test_user()
def test_something(self):
self.assertIsNotNone(self.user)
Base Test Cases¶
BaseTestCase¶
Base class for all tests with common setup:
from htk.test_scaffold.tests import BaseTestCase
class ArticleTestCase(BaseTestCase):
def test_article_creation(self):
# Basic test methods
self.assertIsNotNone(article)
BaseWebTestCase¶
Extended base for web/integration tests:
from htk.test_scaffold.tests import BaseWebTestCase
class ArticleWebTestCase(BaseWebTestCase):
def test_article_view(self):
response = self.client.get('/articles/')
self.assertEqual(response.status_code, 200)
Utilities¶
User Creation¶
from htk.test_scaffold.utils import create_test_user, create_test_username
# Create test user with random username
user = create_test_user()
username = user.username # auto-generated
# Generate random username
username = create_test_username()
Fake Time¶
Mock system time for testing time-dependent features:
from htk.test_scaffold.models import set_fake_timestamp
from datetime import datetime
# Set fake timestamp
fake_time = datetime(2024, 1, 1, 12, 0, 0)
set_fake_timestamp(fake_time)
# Your test runs with fake time
# Reset in tearDown
Fake Prelaunch¶
Mock prelaunch status:
from htk.test_scaffold.models import FakePrelaunch
# Set prelaunch mode
prelaunch = FakePrelaunch.objects.create(is_enabled=True)
Common Patterns¶
Testing with Test Users¶
from htk.test_scaffold.tests import BaseTestCase
from htk.test_scaffold.utils import create_test_user
class UserAuthTestCase(BaseTestCase):
def setUp(self):
super().setUp()
self.user = create_test_user()
self.admin = create_test_user()
def test_user_login(self):
self.client.login(
username=self.user.username,
password='password'
)
response = self.client.get('/profile/')
self.assertEqual(response.status_code, 200)
Testing Time-Dependent Logic¶
from htk.test_scaffold.tests import BaseTestCase
from htk.test_scaffold.models import set_fake_timestamp
from datetime import datetime
class TimeBasedTestCase(BaseTestCase):
def test_expiration(self):
# Set time to before expiration
set_fake_timestamp(datetime(2024, 1, 1))
self.assertTrue(offer.is_valid())
# Move time forward
set_fake_timestamp(datetime(2024, 2, 1))
self.assertFalse(offer.is_valid())
Best Practices¶
- Extend BaseTestCase for all tests
- Use create_test_user() for test users
- Set up in setUp() method
- Tear down in tearDown() method
- Use fake time for time-sensitive tests