from datetime import datetime, timedelta, date from django.test import TestCase from django.utils import timezone from coin.members.models import Member from .models import Item, ItemType, Loan def localize(naive_dt): if not timezone.is_naive(naive_dt): raise ValueError('Expecting a naive datetime') else: return timezone.make_aware(naive_dt, timezone.get_current_timezone()) class HardwareModelsFactoryMixin: def get_item_type(self, **kwargs): params = {'name': 'Foos'} params.update(**kwargs) item_type, _ = ItemType.objects.get_or_create(**kwargs) return item_type def get_item(self, **kwargs): params = { 'type': self.get_item_type(), 'designation': 'Test item', } params.update(**kwargs) item, _ = Item.objects.get_or_create(**params) return item class HardwareLoaningTestCase(HardwareModelsFactoryMixin, TestCase): def setUp(self): self.member = Member.objects.create(username='jdoe') self.item = self.get_item() def test_running_(self): loan_start_date = localize(datetime(2011, 1, 14, 12, 0, 0)) loan = Loan.objects.create( item=self.item, user=self.member, loan_date=loan_start_date) self.assertEqual(Loan.objects.running().count(), 1) self.assertEqual(Loan.objects.finished().count(), 0) loan.item.give_back() self.assertEqual(Loan.objects.running().count(), 0) self.assertEqual(Loan.objects.finished().count(), 1) class ItemTestCase(HardwareModelsFactoryMixin, TestCase): def setUp(self): self.member = Member.objects.create(username='jdoe') self.free_item = self.get_item(designation='free') self.deployed_item = self.get_item( designation='deployed', deployed=True) self.borrowed_item = self.get_item(designation='borrowed') def test_queryset_methods(self): self.assertEqual(Item.objects.borrowed().count(), 0) self.assertEqual(Item.objects.deployed().count(), 1) self.assertEqual(Item.objects.available().count(), 2) self.assertEqual(Item.objects.unavailable().count(), 1) Loan.objects.create( item=self.borrowed_item, user=self.member, loan_date=localize(datetime(2011, 1, 14, 12, 0, 0))) self.assertEqual(Item.objects.borrowed().count(), 1) self.assertEqual(Item.objects.deployed().count(), 1) self.assertEqual(Item.objects.available().count(), 1) self.assertEqual(Item.objects.unavailable().count(), 2)