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 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)
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
|
@ -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(
|
||||||
|
|
Loading…
Reference in New Issue