feat: ues separate fleet repo for each unit test

pull/14/head
Aravinth Manivannan 2022-07-01 19:54:15 +05:30
parent bbcd373fe4
commit 8fc20d16be
Signed by: realaravinth
GPG Key ID: AD9F0F08E855ED88
3 changed files with 73 additions and 60 deletions

View File

@ -26,7 +26,7 @@ from django.conf import settings
from payments import get_payment_model, RedirectNeeded, PaymentStatus
from accounts.tests import register_util, login_util
from dash.tests import create_configurations, create_instance_util
from dash.tests import create_configurations, create_instance_util, infra_custom_config
from dash.models import Instance
from .models import Payment
@ -43,55 +43,21 @@ class BillingTest(TestCase):
register_util(t=self, username=self.username)
create_configurations(t=self)
@override_settings(HOSTEA=infra_custom_config(test_name="test_payments"))
def test_payments(self):
c = Client()
login_util(self, c, "accounts.home")
instance_name = "test_create_instance_renders"
instance_name = "test_payments"
create_instance_util(
t=self, c=c, instance_name=instance_name, config=self.instance_config[0]
)
instance = Instance.objects.get(name=instance_name)
payment_uri = reverse("billing.invoice.generate", args=(instance_name,))
# generate invoice
resp = c.get(payment_uri)
self.assertEqual(resp.status_code, 302)
invoice_uri = resp.headers["Location"]
self.assertEqual("invoice/payment/" in invoice_uri, True)
# try to generate duplicate invoice, but should get redirected to previous invoice
resp = c.get(payment_uri)
self.assertEqual(resp.status_code, 302)
self.assertEqual(invoice_uri == resp.headers["Location"], True)
# check if invoice details page is displaying the invoice
# if payment is yet to be made:
# template will show payment button
# else:
# template will show payment date
resp = c.get(invoice_uri)
self.assertEqual(str.encode(instance_name) in resp.content, True)
self.assertEqual(
str.encode(str(self.instance_config[0].rent)) in resp.content, True
)
self.assertEqual(str.encode("Paid on") in resp.content, False)
# check if the unpaid invoice is displayed in the pending invoice view
resp = c.get(reverse("billing.invoice.pending"))
self.assertEqual(str.encode(invoice_uri) in resp.content, True)
self.assertEqual(payment_fullfilled(instance=instance), False)
# simulate payment. There's probably a better way to do this
payment = get_payment_model().objects.get(paid_by=self.user)
payment.status = PaymentStatus.CONFIRMED
payment.save()
self.assertEqual(payment_fullfilled(instance=instance), True)
#
payment = get_payment_model().objects.get(paid_by=self.user)
invoice_uri = reverse("billing.invoice.details", args=(payment.public_ref,))
# check if paid invoice is listed in paid invoice list view
resp = c.get(reverse("billing.invoice.paid"))
@ -111,6 +77,7 @@ class BillingTest(TestCase):
# try to generate an invoice for the second time on the same VM
# shouldn't be possible since payment is already made for the duration
payment_uri = reverse("billing.invoice.generate", args=(instance.name,))
resp = c.get(payment_uri)
self.assertEqual(resp.status_code, 400)

View File

@ -12,12 +12,20 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import subprocess
import shutil
import os
from time import sleep
from pathlib import Path
from django.contrib.auth import get_user_model
from django.utils.http import urlencode
from django.urls import reverse
from django.test import TestCase, Client, override_settings
from django.conf import settings
from django.db.utils import IntegrityError
from payments import get_payment_model, RedirectNeeded, PaymentStatus
from accounts.tests import login_util, register_util
@ -44,6 +52,28 @@ def create_configurations(t: TestCase):
)
def infra_custom_config(test_name: str):
def create_fleet_repo(test_name: str):
subprocess.run(
["./integration/ci.sh", "new_fleet_repo", test_name],
stdout=subprocess.DEVNULL,
stderr=subprocess.STDOUT,
)
sleep(10)
create_fleet_repo(test_name=test_name)
c = settings.HOSTEA
path = Path(f"/tmp/hostea/dashboard/{test_name}/repo")
if path.exists():
shutil.rmtree(path)
c["INFRA"]["HOSTEA_REPO"]["PATH"] = str(path)
remote_base = os.environ.get("HOSTEA_INFRA_HOSTEA_REPO_REMOTE")
c["INFRA"]["HOSTEA_REPO"]["REMOTE"] = f"{remote_base}{test_name}.git"
print(c["INFRA"]["HOSTEA_REPO"]["REMOTE"])
return c
def create_instance_util(
t: TestCase, c: Client, instance_name: str, config: InstanceConfiguration
):
@ -55,6 +85,22 @@ def create_instance_util(
resp.headers["location"],
reverse("billing.invoice.generate", args=(instance_name,)),
)
# generate invoice
payment_uri = reverse("billing.invoice.generate", args=(instance_name,))
resp = c.get(payment_uri)
t.assertEqual(resp.status_code, 302)
invoice_uri = resp.headers["Location"]
t.assertEqual("invoice/payment/" in invoice_uri, True)
# simulate payment. There's probably a better way to do this
payment = get_payment_model().objects.get(
paid_by=t.user, instance_name=instance_name
)
payment.status = PaymentStatus.CONFIRMED
payment.save()
resp = c.get(reverse("infra.create", args=(instance_name,)))
t.assertEqual(resp.status_code, 200)
class DashHome(TestCase):
@ -151,6 +197,9 @@ class CreateInstance(TestCase):
register_util(t=self, username="createinstance_user")
create_configurations(t=self)
@override_settings(
HOSTEA=infra_custom_config(test_name="test_create_instance_renders")
)
def test_create_instance_renders(self):
c = Client()
login_util(self, c, "accounts.home")
@ -236,12 +285,16 @@ class CreateInstance(TestCase):
resp = c.post(delete_uri)
self.assertEqual(resp.status_code, 302)
self.assertEqual(resp.headers["location"], reverse("dash.home"))
self.assertEqual(
resp.headers["location"], reverse("infra.rm", args=(instance.name,))
)
resp = c.get(resp.headers["location"])
self.assertEqual(resp.status_code, 302)
self.assertEqual(resp.headers["location"], reverse("dash.instances.list"))
self.assertEqual(
Instance.objects.filter(
name=instance.name,
name=instance_name,
owned_by=self.user,
configuration_id=self.instance_config[0],
).exists(),
False,
)

View File

@ -14,7 +14,6 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import shutil
import time
import os
from io import StringIO
from urllib.parse import urlunparse
from pathlib import Path
@ -28,22 +27,13 @@ from git import Repo
from dash.models import Instance, InstanceConfiguration
from accounts.tests import register_util, login_util
from dash.tests import create_configurations, create_instance_util
from dash.tests import create_configurations, create_instance_util, infra_custom_config
from infrastructure.management.commands.vm import translate_sizes
from .utils import Infra, Worker
from .models import InstanceCreated, Job, JobType
def custom_config(test_name: str):
c = settings.HOSTEA
path = Path(f"/tmp/hostea/dashboard/{test_name}/repo")
if path.exists():
shutil.rmtree(path)
c["INFRA"]["HOSTEA_REPO"]["PATH"] = str(path)
return c
class InfraUtilTest(TestCase):
"""
Tests billing system
@ -54,7 +44,7 @@ class InfraUtilTest(TestCase):
register_util(t=self, username=self.username)
create_configurations(t=self)
@override_settings(HOSTEA=custom_config(test_name="test_path_util"))
@override_settings(HOSTEA=infra_custom_config(test_name="test_path_util"))
def test_path_utils(self):
infra = Infra()
subdomain = "foo"
@ -85,7 +75,7 @@ class InfraUtilTest(TestCase):
infra._hostscript_path(subdomain=subdomain),
)
@override_settings(HOSTEA=custom_config(test_name="test_add_vm"))
@override_settings(HOSTEA=infra_custom_config(test_name="test_add_vm"))
def test_add_vm(self):
infra = Infra()
c = Client()
@ -105,9 +95,12 @@ class InfraUtilTest(TestCase):
after_add = infra.repo.head.commit.hexsha
self.assertEqual(before_add is not after_add, True)
c = custom_config(test_name="test_add_vm--get-head")
path = c["INFRA"]["HOSTEA_REPO"]["PATH"]
# c = infra_custom_config(test_name="test_add_vm--get-head")
path = Path("/tmp/hostea/dashboard/check-test_add_vm")
if path.exists():
shutil.rmtree(path)
repo = Repo.clone_from(conf["REMOTE"], path, env=infra.env)
repo.git.pull(env=infra.env)
self.assertEqual(repo.head.commit.hexsha == after_add, True)
before_rm = infra.repo.head.commit.hexsha
@ -115,10 +108,10 @@ class InfraUtilTest(TestCase):
after_rm = infra.repo.head.commit.hexsha
self.assertEqual(before_add is not after_add, True)
repo.git.pull()
repo.git.pull(env=infra.env)
self.assertEqual(repo.head.commit.hexsha == after_rm, True)
@override_settings(HOSTEA=custom_config(test_name="test_cmd"))
@override_settings(HOSTEA=infra_custom_config(test_name="test_cmd"))
def test_cmd(self):
subdomain = "cmd_vm"
infra = Infra()
@ -204,7 +197,7 @@ class InfraUtilTest(TestCase):
w = Worker(job=job)
w.start()
time.sleep(5)
time.sleep(15)
self.assertEqual(w.is_alive(), False)
w.join()
self.assertEqual(