From e023c25f2530f80ffdd3849d0fcd2f3a54711c78 Mon Sep 17 00:00:00 2001 From: Hostea dashboard Date: Sun, 4 Sep 2022 14:31:28 +0530 Subject: [PATCH] fix: don't send emails to VMs that were requested but not created SUMMARY dash.models.Instance is created upon request and infrastructure.models.InstanceCreated when the instance is created. Using data from InstanceCreated to send invoices should solve this issue. --- accounts/tests.py | 8 +++- .../management/commands/generate_invoice.py | 11 ++++-- billing/tests.py | 38 +++++++++++++++++++ 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/accounts/tests.py b/accounts/tests.py index 95d7840..06cd182 100644 --- a/accounts/tests.py +++ b/accounts/tests.py @@ -77,7 +77,9 @@ class LoginTest(TestCase): Tests if login template renders """ resp = self.client.get(reverse("accounts.login")) - self.assertEqual(b"A free forge ecosystem for free developers" in resp.content, True) + self.assertEqual( + b"A free forge ecosystem for free developers" in resp.content, True + ) def test_login_works(self): """ @@ -234,7 +236,9 @@ class RegistrationTest(TestCase): Tests if register template renders """ resp = self.client.get(reverse("accounts.register")) - self.assertEqual(b"A free forge ecosystem for free developers." in resp.content, True) + self.assertEqual( + b"A free forge ecosystem for free developers." in resp.content, True + ) def test_register_works(self): """ diff --git a/billing/management/commands/generate_invoice.py b/billing/management/commands/generate_invoice.py index 76983e4..f5b76d5 100644 --- a/billing/management/commands/generate_invoice.py +++ b/billing/management/commands/generate_invoice.py @@ -22,6 +22,7 @@ from oauth2_provider.generators import generate_client_id, generate_client_secre from accounts.utils import gen_secret from dash.models import Instance +from infrastructure.models import InstanceCreated from billing.utils import generate_invoice, payment_fullfilled Application = get_application_model() @@ -33,10 +34,12 @@ class Command(BaseCommand): def handle(self, *args, **options): instances = Instance.objects.all() if instances: - for instance in Instance.objects.all(): + for paid_instance in InstanceCreated.objects.all(): self.stdout.write(f"Found instance: {instance}") - if not payment_fullfilled(instance=instance): - self.stdout.write(f"Payment not fulfilled for instance: {instance}") - payment = generate_invoice(instance=instance) + if not payment_fullfilled(instance=paid_instance.instance): + self.stdout.write( + f"Payment not fulfilled for instance: {paid_instance.instance}" + ) + payment = generate_invoice(instance=paid_instance.instance) else: self.stdout.write("No instances available") diff --git a/billing/tests.py b/billing/tests.py index 071764a..af09094 100644 --- a/billing/tests.py +++ b/billing/tests.py @@ -148,6 +148,44 @@ class GenerateInvoiceCommand(TestCase): register_util(t=self, username=self.username) create_configurations(t=self) + @override_settings( + HOSTEA=infra_custom_config( + test_name="test_dont_send_invoices_to_not_created_vms" + ) + ) + def test_dont_send_invoices_to_not_created_vms(self): + + c = Client() + login_util(self, c, "accounts.home") + + instance_name = "test_dont_send_invoices_to_not_created_vms" + + payload = {"name": instance_name, "configuration": self.instance_config[0].name} + + resp = c.post(reverse("dash.instances.new"), payload) + self.assertEqual(resp.status_code, 302) + self.assertEqual( + resp.headers["location"], + reverse("billing.invoice.generate", args=(instance_name,)), + ) + + stdout = StringIO() + stderr = StringIO() + + instance = Instance.objects.get(name=instance_name) + self.assertEqual(payment_fullfilled(instance=instance), False) + prev_len = len(mail.outbox) + + # username exists + call_command( + "generate_invoice", + stdout=stdout, + stderr=stderr, + ) + out = stdout.getvalue() + print(out) + self.assertEqual(instance_name not in out, True) + @override_settings( HOSTEA=infra_custom_config(test_name="test_generate_invoice_cmd") )