Files
HaitiWater/code/haitiwater/apps/api/tests/tests_table.py
T

693 lines
23 KiB
Python

import json
from django.contrib.auth.models import User, Group
from django.core.files import File
from django.db import connection
from django.test import TestCase, override_settings
from django.test.client import Client
from ...consumers.models import Consumer
from ...financial.models import Payment
from ...report.models import Ticket, BreakType, UrgencyType
from ...water_network.models import Zone, Element, ElementType, ElementStatus
@override_settings(CACHES={'default': {'BACKEND': 'django.core.cache.backends.dummy.DummyCache'}})
class TableTests(TestCase):
fixtures = ["initial_data"]
@classmethod # Horrible hack to get the views
def setUpClass(cls):
super(TableTests, cls).setUpClass()
file_handle = open('views.sql', 'r+')
sql_file = File(file_handle)
sql = sql_file.read()
cursor = connection.cursor()
cursor.execute(sql)
cursor.close()
def setUp(self):
self.client = Client()
self.client.login(username="Protos", password="Protos")
superzone = Zone.objects.get(name="Haiti")
zone = Zone(name="zone", superzone=superzone, subzones=["zone"],
fountain_price=100, fountain_duration=10,
kiosk_price=200, kiosk_duration=12,
indiv_base_price=300)
zone.save()
superzone.subzones.append(zone.name)
superzone.save()
fountain = Element(name="fountain", type=ElementType.FOUNTAIN.name,
status=ElementStatus.OK.name, location="fountain", zone=superzone)
fountain.save()
indiv = Element(name="indiv", type=ElementType.INDIVIDUAL.name,
status=ElementStatus.OK.name, location="indiv", zone=superzone)
indiv.save()
user = User.objects.create_user(username="user_zone", email="test@gmail.com", password="test",
first_name="test", last_name="test")
user.profile.phone_number = None
user.profile.zone = zone
user.profile.save()
my_group = Group.objects.get(name='Gestionnaire de zone')
my_group.user_set.add(user)
user = User.objects.create_user(username="user_fountain", email="test@gmail.com", password="test",
first_name="test", last_name="test")
user.profile.phone_number = None
user.profile.outlets.append(fountain.id)
user.profile.save()
my_group = Group.objects.get(name='Gestionnaire de fontaine')
my_group.user_set.add(user)
consumer_fountain = Consumer(first_name="consumer", last_name="fountain", gender="M",
location="test", household_size=1, water_outlet=fountain)
consumer_fountain.save()
consumer_indiv = Consumer(first_name="consumer", last_name="indiv", gender="M",
location="test", household_size=1, water_outlet=indiv)
consumer_indiv.save()
ticket = Ticket(water_outlet=fountain, type=BreakType.MECHANICAL.name,
comment="test", urgency=UrgencyType.LOW.name)
ticket.save()
payment = Payment(consumer=consumer_fountain, water_outlet=fountain, amount=100)
payment.save()
self.client.post("/api/gis/?id={}&action=add".format(fountain.id), {
"geometry": {
"type": "Point",
"coordinates": [-72.331783, 19.394068]
}
}, content_type="application/json")
def tearDown(self):
self.client.logout()
def test_get_table_not_connected(self):
self.client.logout()
response = self.client.get("/api/table/")
self.assertEqual(response.status_code, 403)
# Zone
def test_get_zone(self):
response = self.client.get("/api/table/", {
"name": "zone",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 2)
self.assertEqual(result["recordsFiltered"], 2)
self.assertEqual(len(result["data"]), 2)
def test_get_zone_sub(self):
self.client.login(username="user_zone", password="test")
response = self.client.get("/api/table/", {
"name": "zone",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 1)
self.assertEqual(result["recordsFiltered"], 1)
self.assertEqual(len(result["data"]), 1)
def test_get_zone_unauthorized(self):
self.client.login(username="user_fountain", password="test")
response = self.client.get("/api/table/", {
"name": "zone",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 403)
# Element
def test_get_element(self):
response = self.client.get("/api/table/", {
"name": "water_element",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 2)
self.assertEqual(result["recordsFiltered"], 2)
self.assertEqual(len(result["data"]), 2)
def test_get_element_sub(self):
self.client.login(username="user_zone", password="test")
response = self.client.get("/api/table/", {
"name": "water_element",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 0)
self.assertEqual(result["recordsFiltered"], 0)
self.assertEqual(len(result["data"]), 0)
def test_get_element_fountain(self):
self.client.login(username="user_fountain", password="test")
response = self.client.get("/api/table/", {
"name": "water_element",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 1)
self.assertEqual(result["recordsFiltered"], 1)
self.assertEqual(len(result["data"]), 1)
# Consumer
def test_get_consumer(self):
response = self.client.get("/api/table/", {
"name": "consumer",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 2)
self.assertEqual(result["recordsFiltered"], 2)
self.assertEqual(len(result["data"]), 2)
def test_get_consumer_sub(self):
self.client.login(username="user_zone", password="test")
response = self.client.get("/api/table/", {
"name": "consumer",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 0)
self.assertEqual(result["recordsFiltered"], 0)
self.assertEqual(len(result["data"]), 0)
def test_get_consumer_fountain(self):
self.client.login(username="user_fountain", password="test")
response = self.client.get("/api/table/", {
"name": "consumer",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 1)
self.assertEqual(result["recordsFiltered"], 1)
self.assertEqual(len(result["data"]), 1)
# Manager
def test_get_manager(self):
response = self.client.get("/api/table/", {
"name": "manager",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 3)
self.assertEqual(result["recordsFiltered"], 3)
self.assertEqual(len(result["data"]), 3)
def test_get_manager_sub(self):
self.client.login(username="user_zone", password="test")
response = self.client.get("/api/table/", {
"name": "manager",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 1)
self.assertEqual(result["recordsFiltered"], 1)
self.assertEqual(len(result["data"]), 1)
def test_get_manager_unauthorized(self):
self.client.login(username="user_fountain", password="test")
response = self.client.get("/api/table/", {
"name": "manager",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 403)
# Ticket
def test_get_ticket(self):
response = self.client.get("/api/table/", {
"name": "ticket",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 1)
self.assertEqual(result["recordsFiltered"], 1)
self.assertEqual(len(result["data"]), 1)
def test_get_ticket_sub(self):
self.client.login(username="user_zone", password="test")
response = self.client.get("/api/table/", {
"name": "ticket",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 0)
self.assertEqual(result["recordsFiltered"], 0)
self.assertEqual(len(result["data"]), 0)
def test_get_ticket_fountain(self):
self.client.login(username="user_fountain", password="test")
response = self.client.get("/api/table/", {
"name": "ticket",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 1)
self.assertEqual(result["recordsFiltered"], 1)
self.assertEqual(len(result["data"]), 1)
# Payment
def test_get_payment(self):
response = self.client.get("/api/table/", {
"name": "payment",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 200)
def test_get_payment_user(self):
consumer = Consumer.objects.get(last_name="fountain")
response = self.client.get("/api/table/", {
"name": "payment",
"order[0][column]": "0",
"order[0][dir]": "asc",
"user": consumer.id
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 1)
self.assertEqual(result["recordsFiltered"], 1)
self.assertEqual(len(result["data"]), 1)
def test_get_payment_sub(self):
self.client.login(username="user_zone", password="test")
consumer = Consumer.objects.get(last_name="fountain")
response = self.client.get("/api/table/", {
"name": "payment",
"order[0][column]": "0",
"order[0][dir]": "asc",
"user": consumer.id
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 0)
self.assertEqual(result["recordsFiltered"], 0)
self.assertEqual(len(result["data"]), 0)
def test_get_payment_fountain(self):
self.client.login(username="user_fountain", password="test")
consumer = Consumer.objects.get(last_name="fountain")
response = self.client.get("/api/table/", {
"name": "payment",
"order[0][column]": "0",
"order[0][dir]": "asc",
"user": consumer.id
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 1)
self.assertEqual(result["recordsFiltered"], 1)
self.assertEqual(len(result["data"]), 1)
# Logs
def test_get_log(self):
response = self.client.get("/api/table/", {
"name": "logs",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 0)
self.assertEqual(result["recordsFiltered"], 0)
self.assertEqual(len(result["data"]), 0)
def test_get_log_history(self):
response = self.client.get("/api/table/", {
"name": "logs_history",
"order[0][column]": "0",
"order[0][dir]": "asc"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 0)
self.assertEqual(result["recordsFiltered"], 0)
self.assertEqual(len(result["data"]), 0)
# Datatable
def test_search_none(self):
response = self.client.get("/api/table/", {
"name": "zone",
"order[0][column]": "0",
"order[0][dir]": "asc",
"search[value]": "test",
"columns[1][searchable]": True
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 2)
self.assertEqual(result["recordsFiltered"], 0)
self.assertEqual(len(result["data"]), 0)
def test_search_in(self):
response = self.client.get("/api/table/", {
"name": "zone",
"order[0][column]": "0",
"order[0][dir]": "asc",
"search[value]": "Haiti",
"columns[1][searchable]": True
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 2)
self.assertEqual(result["recordsFiltered"], 1)
self.assertEqual(len(result["data"]), 1)
def test_too_long(self):
for i in range(18):
self.client.post("/api/add/", {"table": "zone", "name": "test" + str(i)})
response = self.client.get("/api/table/", {
"name": "zone",
"order[0][column]": "0",
"order[0][dir]": "asc",
"start": "0",
"length": "10"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 20)
self.assertEqual(result["recordsFiltered"], 20)
self.assertEqual(len(result["data"]), 10)
def test_second_page(self):
for i in range(18):
self.client.post("/api/add/", {"table": "zone", "name": "test" + str(i)})
response = self.client.get("/api/table/", {
"name": "zone",
"order[0][column]": "0",
"order[0][dir]": "asc",
"start": "5",
"length": "5"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 20)
self.assertEqual(result["recordsFiltered"], 20)
self.assertEqual(len(result["data"]), 5)
def test_desc(self):
for i in range(18):
self.client.post("/api/add/", {"table": "zone", "name": "test" + str(i)})
response = self.client.get("/api/table/", {
"name": "zone",
"order[0][column]": "0",
"order[0][dir]": "desc",
"start": "0",
"length": "10"
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["recordsTotal"], 20)
self.assertEqual(result["recordsFiltered"], 20)
self.assertEqual(len(result["data"]), 10)
# Graph
def test_get_graph_not_connected(self):
self.client.logout()
response = self.client.get("/api/graph/")
self.assertEqual(response.status_code, 403)
def test_get_graph_gender(self):
response = self.client.get("/api/graph/", {"type": "consumer_gender_pie"})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(len(result["jsonarray"]), 3)
self.assertEqual(result["jsonarray"][1]["data"], 2)
def test_get_graph_gender_sub(self):
self.client.login(username="user_zone", password="test")
response = self.client.get("/api/graph/", {"type": "consumer_gender_pie"})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(len(result["jsonarray"]), 3)
self.assertEqual(result["jsonarray"][1]["data"], 0)
def test_get_graph_gender_fountain(self):
self.client.login(username="user_fountain", password="test")
response = self.client.get("/api/graph/", {"type": "consumer_gender_pie"})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(len(result["jsonarray"]), 3)
self.assertEqual(result["jsonarray"][1]["data"], 1)
def test_get_graph_volume(self):
response = self.client.get("/api/graph/", {"type": "average_monthly_volume_per_zone"})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(len(result["jsonarray"][0]["label"]), 2)
def test_get_graph_volume_sub(self):
self.client.login(username="user_zone", password="test")
response = self.client.get("/api/graph/", {"type": "average_monthly_volume_per_zone"})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(len(result["jsonarray"][0]["label"]), 1)
def test_get_graph_volume_fountain(self):
self.client.login(username="user_fountain", password="test")
response = self.client.get("/api/graph/", {"type": "average_monthly_volume_per_zone"})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(len(result["jsonarray"][0]["label"]), 1)
# GIS
def test_get_gis_not_connected(self):
self.client.logout()
response = self.client.get("/api/gis/")
self.assertEqual(response.status_code, 403)
def test_get_gis(self):
response = self.client.get("/api/gis/")
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(len(result), 1)
def test_get_gis_sub(self):
self.client.login(username="user_zone", password="test")
response = self.client.get("/api/gis/")
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(len(result), 0)
def test_get_gis_fountain(self):
self.client.login(username="user_fountain", password="test")
response = self.client.get("/api/gis/")
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(len(result), 1)
def test_get_gis_marker(self):
response = self.client.get("/api/gis/", {"marker": "fountain"})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(len(result), 1)
def test_get_gis_no_marker(self):
response = self.client.get("/api/gis/", {"marker": "kiosk"})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(len(result), 0)
# Details
def test_get_details_not_connected(self):
self.client.logout()
response = self.client.get("/api/details/")
self.assertEqual(response.status_code, 403)
def test_get_details_payment(self):
consumer = Consumer.objects.get(last_name="fountain")
response = self.client.get("/api/details/", {
"table": "payment",
"id": consumer.id
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["balance"], 100)
def test_get_details_payment_not_exists(self):
response = self.client.get("/api/details/", {
"table": "payment",
"id": 1000
})
self.assertEqual(response.status_code, 400)
def test_get_details_payment_unauthorized(self):
self.client.login(username="user_zone", password="test")
consumer = Consumer.objects.get(last_name="fountain")
response = self.client.get("/api/details/", {
"table": "payment",
"id": consumer.id
})
self.assertEqual(response.status_code, 403)
def test_get_details_location(self):
fountain = Element.objects.get(name="fountain")
response = self.client.get("/api/details/", {
"table": "water_element",
"id": fountain.id
})
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(result["localization"], "fountain")
self.assertIsNotNone(result["geoJSON"])
def test_get_details_location_not_exists(self):
response = self.client.get("/api/details/", {
"table": "water_element",
"id": 1000
})
self.assertEqual(response.status_code, 400)
def test_get_details_location_unauthorized(self):
self.client.login(username="user_zone", password="test")
fountain = Element.objects.get(name="fountain")
response = self.client.get("/api/details/", {
"table": "water_element",
"id": fountain.id
})
self.assertEqual(response.status_code, 403)
# Outlets
def test_get_outlets_not_connected(self):
self.client.logout()
response = self.client.get("/api/outlets/")
self.assertEqual(response.status_code, 403)
def test_get_outlets(self):
response = self.client.get("/api/outlets/")
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(len(result["data"]), 2)
def test_get_outlets_sub(self):
self.client.login(username="user_zone", password="test")
response = self.client.get("/api/outlets/")
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(len(result["data"]), 0)
def test_get_outlets_fountain(self):
self.client.login(username="user_fountain", password="test")
response = self.client.get("/api/outlets/")
self.assertEqual(response.status_code, 200)
result = json.loads(response.content)
self.assertEqual(len(result["data"]), 1)