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 payments import get_payment_model, RedirectNeeded, PaymentStatus
from accounts.tests import register_util, login_util 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 dash.models import Instance
from .models import Payment from .models import Payment
@ -43,55 +43,21 @@ class BillingTest(TestCase):
register_util(t=self, username=self.username) register_util(t=self, username=self.username)
create_configurations(t=self) create_configurations(t=self)
@override_settings(HOSTEA=infra_custom_config(test_name="test_payments"))
def test_payments(self): def test_payments(self):
c = Client() c = Client()
login_util(self, c, "accounts.home") login_util(self, c, "accounts.home")
instance_name = "test_create_instance_renders" instance_name = "test_payments"
create_instance_util( create_instance_util(
t=self, c=c, instance_name=instance_name, config=self.instance_config[0] t=self, c=c, instance_name=instance_name, config=self.instance_config[0]
) )
instance = Instance.objects.get(name=instance_name) 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) 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 # check if paid invoice is listed in paid invoice list view
resp = c.get(reverse("billing.invoice.paid")) 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 # 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 # 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) resp = c.get(payment_uri)
self.assertEqual(resp.status_code, 400) 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 # 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/>. # 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.contrib.auth import get_user_model
from django.utils.http import urlencode from django.utils.http import urlencode
from django.urls import reverse from django.urls import reverse
from django.test import TestCase, Client, override_settings from django.test import TestCase, Client, override_settings
from django.conf import settings from django.conf import settings
from django.db.utils import IntegrityError from django.db.utils import IntegrityError
from payments import get_payment_model, RedirectNeeded, PaymentStatus
from accounts.tests import login_util, register_util 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( def create_instance_util(
t: TestCase, c: Client, instance_name: str, config: InstanceConfiguration t: TestCase, c: Client, instance_name: str, config: InstanceConfiguration
): ):
@ -55,6 +85,22 @@ def create_instance_util(
resp.headers["location"], resp.headers["location"],
reverse("billing.invoice.generate", args=(instance_name,)), 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): class DashHome(TestCase):
@ -151,6 +197,9 @@ class CreateInstance(TestCase):
register_util(t=self, username="createinstance_user") register_util(t=self, username="createinstance_user")
create_configurations(t=self) create_configurations(t=self)
@override_settings(
HOSTEA=infra_custom_config(test_name="test_create_instance_renders")
)
def test_create_instance_renders(self): def test_create_instance_renders(self):
c = Client() c = Client()
login_util(self, c, "accounts.home") login_util(self, c, "accounts.home")
@ -236,12 +285,16 @@ class CreateInstance(TestCase):
resp = c.post(delete_uri) resp = c.post(delete_uri)
self.assertEqual(resp.status_code, 302) 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( self.assertEqual(
Instance.objects.filter( Instance.objects.filter(
name=instance.name, name=instance_name,
owned_by=self.user, owned_by=self.user,
configuration_id=self.instance_config[0],
).exists(), ).exists(),
False, False,
) )

View File

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