# import json # from . import models as m # from django.urls import reverse # from django.test import Client, TestCase # from django.contrib.auth import get_user_model # from django_ledger.io.io_core import get_localdate # from django.core.exceptions import ObjectDoesNotExist # from decimal import Decimal # from unittest.mock import MagicMock # from inventory.models import VatRate # from inventory.utils import CarFinanceCalculator # User = get_user_model() # # Create your tests here. # class ModelTest(TestCase): # """ # Test case class designed to test models in the application. The tests # verify model creation, related object creation, and appropriate # functionality for specific business logic, ensuring correctness and # reliability of the defined models. # This class tests the following: # - Dealer model, including associated user and entity creation. # - Car model, ensuring product creation and validations. # - Testing of car finances, including finance totals and relationships. # - Creation of additional services, ensuring the generation of corresponding # item services. # :ivar vat: Vat rate created for testing purposes. # :type vat: VatRate instance # :ivar dealer: Dealer instance created for testing. # :type dealer: Dealer instance # :ivar car_make: Car make created for testing purposes. # :type car_make: CarMake instance # :ivar car_model: Car model created for testing purposes. # :type car_model: CarModel instance # :ivar car_serie: Car series created for testing purposes. # :type car_serie: CarSerie instance # :ivar trim: Car trim created for testing purposes. # :type trim: CarTrim instance # :ivar car: Car object created for testing. # :type car: Car instance # :ivar car_finances: Car finance object for the car under test. # :type car_finances: CarFinance instance # """ # def setUp(self): # email = "RkzgO@example.com" # name = "John Doe" # password = "password" # crn = "123456789" # vrn = "123456789" # phone = "123456789" # address = "123 Main St" # arabic_name = "الاسم بالعربية" # self.vat = m.VatRate.objects.create(rate=0.15) # user = User.objects.create(username=email, email=email) # user.set_password(password) # user.save() # self.dealer = m.Dealer.objects.create( # user=user, # name=name, # arabic_name=arabic_name, # crn=crn, # vrn=vrn, # phone_number=phone, # address=address, # ) # self.car_make = m.CarMake.objects.create(name="Make") # self.car_model = m.CarModel.objects.create( # name="Model", id_car_make=self.car_make # ) # self.car_serie = m.CarSerie.objects.create( # name="Serie", id_car_model=self.car_model # ) # self.trim = m.CarTrim.objects.create(name="Trim", id_car_serie=self.car_serie) # self.car = m.Car.objects.create( # vin="123456789", # dealer=self.dealer, # id_car_make=self.car_make, # id_car_model=self.car_model, # id_car_serie=self.car_serie, # year=2020, # id_car_trim=self.trim, # receiving_date=get_localdate(), # ) # self.car_finances = m.CarFinance.objects.create( # car=self.car, selling_price=1000, cost_price=500, discount_amount=200 # ) # def test_dealer_creation_creates_user_and_entity(self): # dealer = self.dealer # self.assertEqual(User.objects.count(), 1) # self.assertEqual(m.Dealer.objects.count(), 1) # self.assertEqual(User.objects.first().username, "RkzgO@example.com") # self.assertEqual(User.objects.first().email, "RkzgO@example.com") # self.assertTrue(User.objects.first().check_password("password")) # self.assertEqual(dealer.user, User.objects.first()) # self.assertEqual(dealer.name, "John Doe") # self.assertEqual(dealer.arabic_name, "الاسم بالعربية") # self.assertEqual(dealer.crn, "123456789") # self.assertEqual(dealer.vrn, "123456789") # self.assertEqual(dealer.phone_number, "123456789") # self.assertEqual(dealer.address, "123 Main St") # self.assertIsNotNone(dealer.entity) # self.assertEqual(dealer.entity.name, dealer.name) # self.assertEqual(dealer.entity.get_all_accounts().count(), 57) # self.assertEqual(dealer.entity.get_uom_all().count(), 16) # def test_car_creation_creates_product(self): # dealer = self.dealer # self.assertEqual(m.Car.objects.count(), 1) # self.assertEqual(self.car.vin, "123456789") # self.assertEqual(self.car.dealer, dealer) # self.assertEqual(self.car.id_car_make, self.car_make) # self.assertEqual(self.car.id_car_model, self.car_model) # self.assertEqual(self.car.id_car_serie, self.car_serie) # self.assertEqual(self.car.year, 2020) # self.assertEqual(self.car.id_car_trim, self.trim) # product = dealer.entity.get_items_all().filter(name=self.car.vin).first() # self.assertEqual(product.name, self.car.vin) # def test_car_finances_creation(self): # self.assertEqual(m.CarFinance.objects.count(), 1) # self.assertEqual(self.car_finances.car, self.car) # self.assertEqual(self.car_finances.selling_price, 1000) # self.assertEqual(self.car_finances.cost_price, 500) # self.assertEqual(self.car_finances.discount_amount, 200) # def test_car_finance_total(self): # self.assertEqual(m.CarFinance.objects.count(), 1) # self.assertEqual(self.car_finances.total, 1000) # self.assertEqual(self.car_finances.total_discount, 800) # self.assertEqual(self.car_finances.total_vat, 920) # def test_car_additional_services_create_item_service(self): # m.AdditionalServices.objects.create( # name="Service", # price=100, # description="Description", # dealer=self.dealer, # taxable=True, # uom=m.UnitOfMeasure.PIECE, # ) # self.assertEqual( # m.ItemModel.objects.filter( # name="Service", # default_amount=100, # is_product_or_service=True, # item_role="service", # ).count(), # 1, # ) # class AuthenticationTest(TestCase): # """ # Represents a set of test cases for user authentication and signup validation within # a web application. These tests ensure the correctness of authentication functionalities # such as login and signing up with appropriate JSON data handling. # :ivar client: Django test client used to simulate HTTP requests within the test framework. # :type client: Client # :ivar url: URL for account signup endpoint used in the test cases. # :type url: str # """ # def setUp(self): # self.client = Client() # self.url = reverse("account_signup") # def test_login(self): # url = reverse("account_login") # response = self.client.post( # url, {"email": "RkzgO@example.com", "password": "password"} # ) # self.assertEqual(response.status_code, 200) # def test_valid_data(self): # # Create valid JSON data # data = { # "wizardValidationForm1": { # "email": "test@example.com", # "password": "password123", # "confirm_password": "password123", # }, # "wizardValidationForm2": { # "name": "John Doe", # "arabic_name": "جون دو", # "phone_number": "1234567890", # }, # "wizardValidationForm3": { # "crn": "123456", # "vrn": "789012", # "address": "123 Main St", # }, # } # # Send a POST request with the JSON data # response = self.client.post( # self.url, data=json.dumps(data), content_type="application/json" # ) # # Check the response # self.assertEqual(response.status_code, 200) # self.assertEqual(response.json(), {"message": "User created successfully."}) # def test_passwords_do_not_match(self): # # Create JSON data with mismatched passwords # data = { # "wizardValidationForm1": { # "email": "test@example.com", # "password": "password123", # "confirm_password": "differentpassword", # }, # "wizardValidationForm2": { # "name": "John Doe", # "arabic_name": "جون دو", # "phone_number": "1234567890", # }, # "wizardValidationForm3": { # "crn": "123456", # "vrn": "789012", # "address": "123 Main St", # }, # } # # Send a POST request with the JSON data # response = self.client.post( # self.url, data=json.dumps(data), content_type="application/json" # ) # # Check the response # self.assertEqual(response.status_code, 400) # self.assertEqual(response.json(), {"error": "Passwords do not match."}) # def test_missing_required_fields(self): # # Create JSON data with missing required fields # data = { # "wizardValidationForm1": { # "email": "test@example.com", # "password": "password123", # # Missing "confirm_password" # }, # "wizardValidationForm2": { # "name": "John Doe", # "arabic_name": "جون دو", # "phone_number": "1234567890", # }, # "wizardValidationForm3": { # "crn": "123456", # "vrn": "789012", # "address": "123 Main St", # }, # } # # Send a POST request with the JSON data # response = self.client.post( # self.url, data=json.dumps(data), content_type="application/json" # ) # # Check the response # self.assertEqual(response.status_code, 400) # self.assertIn( # "error", response.json() # ) # Assuming the view returns an error for missing fields # class CarFinanceCalculatorTests(TestCase): # """ # Unit tests for the CarFinanceCalculator class. # This class contains various test cases to validate the correct functionality # of the CarFinanceCalculator. It includes tests for VAT rate retrieval, # item transactions, car data extraction, calculation of totals, fetching # additional services, and finance-related data processing. # :ivar mock_model: Mocked model used to simulate interactions with the # CarFinanceCalculator instance. # :type mock_model: unittest.mock.MagicMock # :ivar vat_rate: Active VAT rate used for testing VAT rate retrieval. # :type vat_rate: VatRate # """ # def setUp(self): # # Common setup for all tests # self.mock_model = MagicMock() # self.vat_rate = VatRate.objects.create(rate=Decimal("0.20"), is_active=True) # def test_no_active_vat_rate_raises_error(self): # VatRate.objects.all().delete() # Ensure no active VAT # with self.assertRaises(ObjectDoesNotExist): # CarFinanceCalculator(self.mock_model) # def test_vat_rate_retrieval(self): # calculator = CarFinanceCalculator(self.mock_model) # self.assertEqual(calculator.vat_rate, Decimal("0.20")) # def test_item_transactions_retrieval(self): # mock_item = MagicMock() # self.mock_model.get_itemtxs_data.return_value = [ # MagicMock(all=lambda: [mock_item]) # ] # calculator = CarFinanceCalculator(self.mock_model) # self.assertEqual(calculator.item_transactions, [mock_item]) # def test_get_car_data(self): # mock_item = MagicMock() # mock_item.ce_quantity = 2 # mock_item.item_model = MagicMock() # mock_item.item_model.item_number = "123" # mock_item.item_model.additional_info = { # CarFinanceCalculator.CAR_FINANCE_KEY: { # "selling_price": "10000", # "cost_price": "8000", # "discount_amount": "500", # "total_vat": "2000", # }, # CarFinanceCalculator.CAR_INFO_KEY: { # "vin": "VIN123", # "make": "Toyota", # "model": "Camry", # "year": 2020, # "trim": "LE", # "mileage": 15000, # }, # CarFinanceCalculator.ADDITIONAL_SERVICES_KEY: [ # {"name": "Service 1", "price": "200", "taxable": True, "price_": "240"} # ], # } # calculator = CarFinanceCalculator(self.mock_model) # car_data = calculator._get_car_data(mock_item) # self.assertEqual(car_data["item_number"], "123") # self.assertEqual(car_data["vin"], "VIN123") # self.assertEqual(car_data["make"], "Toyota") # self.assertEqual(car_data["selling_price"], "10000") # self.assertEqual(car_data["unit_price"], Decimal("10000")) # self.assertEqual(car_data["quantity"], 2) # self.assertEqual(car_data["total"], Decimal("20000")) # self.assertEqual(car_data["total_vat"], "2000") # self.assertEqual( # car_data["additional_services"], # [{"name": "Service 1", "price": "200", "taxable": True, "price_": "240"}], # ) # def test_get_additional_services(self): # mock_item1 = MagicMock() # mock_item1.item_model.additional_info = { # CarFinanceCalculator.ADDITIONAL_SERVICES_KEY: [ # {"name": "Service 1", "price": "100", "taxable": True, "price_": "120"} # ] # } # mock_item2 = MagicMock() # mock_item2.item_model.additional_info = { # CarFinanceCalculator.ADDITIONAL_SERVICES_KEY: [ # {"name": "Service 2", "price": "200", "taxable": False, "price_": "200"} # ] # } # self.mock_model.get_itemtxs_data.return_value = [ # MagicMock(all=lambda: [mock_item1, mock_item2]) # ] # calculator = CarFinanceCalculator(self.mock_model) # services = calculator._get_additional_services() # self.assertEqual(len(services), 2) # self.assertEqual(services[0]["name"], "Service 1") # self.assertEqual(services[1]["name"], "Service 2") # self.assertEqual(services[0]["price_"], "120") # self.assertEqual(services[1]["price_"], "200") # def test_calculate_totals(self): # mock_item1 = MagicMock() # mock_item1.ce_quantity = 2 # mock_item1.item_model.additional_info = { # CarFinanceCalculator.CAR_FINANCE_KEY: { # "selling_price": "10000", # "discount_amount": "500", # }, # CarFinanceCalculator.ADDITIONAL_SERVICES_KEY: [ # {"price_": "100"}, # {"price_": "200"}, # ], # } # mock_item2 = MagicMock() # mock_item2.quantity = 3 # mock_item2.item_model.additional_info = { # CarFinanceCalculator.CAR_FINANCE_KEY: { # "selling_price": "20000", # "discount_amount": "1000", # }, # CarFinanceCalculator.ADDITIONAL_SERVICES_KEY: [{"price_": "300"}], # } # self.mock_model.get_itemtxs_data.return_value = [ # MagicMock(all=lambda: [mock_item1, mock_item2]) # ] # calculator = CarFinanceCalculator(self.mock_model) # totals = calculator.calculate_totals() # expected_total_price = (Decimal("10000") * 2 + Decimal("20000") * 3) - ( # Decimal("500") + Decimal("1000") # ) # expected_vat = expected_total_price * Decimal("0.15") # expected_additionals = Decimal("100") + Decimal("200") + Decimal("300") # expected_grand_total = ( # expected_total_price + expected_vat + expected_additionals # ).quantize(Decimal("0.00")) # self.assertEqual(totals["total_price"], expected_total_price) # self.assertEqual(totals["total_discount"], Decimal("1500")) # self.assertEqual(totals["total_vat_amount"], expected_vat) # self.assertEqual(totals["total_additionals"], expected_additionals) # self.assertEqual(totals["grand_total"], expected_grand_total) # def test_get_finance_data(self): # mock_item = MagicMock() # mock_item.ce_quantity = 1 # mock_item.item_model = MagicMock() # mock_item.item_model.item_number = "456" # mock_item.item_model.additional_info = { # CarFinanceCalculator.CAR_FINANCE_KEY: { # "selling_price": "15000", # "discount_amount": "1000", # "total_vat": "2800", # }, # CarFinanceCalculator.CAR_INFO_KEY: { # "vin": "VIN456", # "make": "Honda", # "model": "Civic", # "year": 2021, # }, # CarFinanceCalculator.ADDITIONAL_SERVICES_KEY: [ # {"name": "Service", "price": "150", "taxable": True, "price_": "180"} # ], # } # self.mock_model.get_itemtxs_data.return_value = [ # MagicMock(all=lambda: [mock_item]) # ] # calculator = CarFinanceCalculator(self.mock_model) # finance_data = calculator.get_finance_data() # self.assertEqual(len(finance_data["cars"]), 1) # self.assertEqual(finance_data["quantity"], 1) # self.assertEqual(finance_data["total_price"], Decimal("14000")) # 15000 - 1000 # self.assertEqual( # finance_data["total_vat"], # Decimal("14000") + (Decimal("14000") * Decimal("0.20")), # ) # self.assertEqual( # finance_data["total_vat_amount"], Decimal("14000") * Decimal("0.20") # ) # self.assertEqual(finance_data["total_additionals"], Decimal("180")) # self.assertEqual(finance_data["additionals"][0]["name"], "Service") # self.assertEqual(finance_data["vat"], Decimal("0.20"))