forked from Hostea/dashboard
feat: ues separate fleet repo for each unit test
parent
bbcd373fe4
commit
8fc20d16be
|
@ -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)
|
||||
|
||||
|
|
|
@ -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,
|
||||
)
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue