ottertune/server/website/tests/test_views.py

257 lines
11 KiB
Python

#
# OtterTune - test_views.py
#
# Copyright (c) 2017-18, Carnegie Mellon University Database Group
#
'''
Created on Dec 13, 2017
@author: dvanaken
'''
from django.contrib.auth import get_user
from django.core.urlresolvers import reverse
from django.test import TestCase
from .utils import (TEST_BASIC_SESSION_ID, TEST_PASSWORD, TEST_PROJECT_ID, TEST_USERNAME)
from website.db import target_objectives
class UserAuthViewTests(TestCase):
fixtures = ['test_user.json', 'test_user_sessions.json']
def setUp(self):
pass
def test_valid_login(self):
data = {
'username': TEST_USERNAME,
'password': TEST_PASSWORD
}
response = self.client.post(reverse('login'), data=data)
self.assertRedirects(response, reverse('home_projects'))
user = get_user(self.client)
self.assertTrue(user.is_authenticated())
def test_invalid_login(self):
data = {
'username': 'invalid_user',
'password': 'invalid_password'
}
response = self.client.post(reverse('login'), data=data)
self.assertEqual(response.status_code, 200)
user = get_user(self.client)
self.assertFalse(user.is_authenticated())
def test_login_view(self):
response = self.client.get(reverse('login'))
self.assertEqual(response.status_code, 200)
def test_new_signup(self):
response = self.client.get(reverse('signup'))
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Create Your Account")
def test_logout_view(self):
self.client.logout()
user = get_user(self.client)
self.assertFalse(user.is_authenticated())
class ProjectViewsTests(TestCase):
fixtures = ['test_website.json']
def setUp(self):
self.client.login(username=TEST_USERNAME, password=TEST_PASSWORD)
def test_new_project_form(self):
response = self.client.get(reverse('new_project'))
self.assertEqual(response.status_code, 200)
def test_create_project_fail_invalidation(self):
form_addr = reverse('new_project')
post_data = {}
response = self.client.post(form_addr, post_data)
self.assertEqual(response.status_code, 200)
self.assertFormError(response, 'form', 'name', "This field is required.")
def test_create_project_ok(self):
form_addr = reverse('new_project')
post_data = {
'name': 'test_create_project',
'description': 'testing create project...'
}
response = self.client.post(form_addr, post_data, follow=True)
self.assertEqual(response.status_code, 200)
project_id = response.context['project'].pk
self.assertRedirects(response, reverse('project_sessions',
kwargs={'project_id': project_id}))
def test_edit_project_fail_invalidation(self):
form_addr = reverse('edit_project', kwargs={'project_id': TEST_PROJECT_ID})
post_data = {}
response = self.client.post(form_addr, post_data)
self.assertFormError(response, 'form', 'name', "This field is required.")
def test_edit_project_ok(self):
form_addr = reverse('edit_project', kwargs={'project_id': TEST_PROJECT_ID})
post_data = {'name': 'new_project_name'}
response = self.client.post(form_addr, post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertRedirects(response, reverse('project_sessions',
kwargs={'project_id': TEST_PROJECT_ID}))
def test_delete_zero_project(self):
form_addr = reverse('delete_project')
post_data = {'projects': []}
response = self.client.post(form_addr, post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertRedirects(response, reverse('home_projects'))
def test_delete_one_project(self):
form_addr = reverse('delete_project')
post_data = {'projects': [TEST_PROJECT_ID]}
response = self.client.post(form_addr, post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertRedirects(response, reverse('home_projects'))
def test_delete_multiple_projects(self):
create_form_addr = reverse('new_project')
project_ids = []
for i in range(5):
post_data = {
'name': 'project_{}'.format(i),
'description': ""
}
response = self.client.post(create_form_addr, post_data, follow=True)
self.assertEqual(response.status_code, 200)
project_ids.append(response.context['project'].pk)
delete_form_addr = reverse('delete_project')
post_data = {'projects': project_ids}
response = self.client.post(delete_form_addr, post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertRedirects(response, reverse('home_projects'))
class SessionViewsTests(TestCase):
fixtures = ['test_website.json']
post_data = {
'name': 'test_create_basic_session',
'description': 'testing create basic session...',
'tuning_session': 'no_tuning_session',
'target_objective': target_objectives.default(),
'algorithm': 1,
'cpu': '2',
'memory': '16',
'storage': '32',
'storage_type': 5,
'dbms': 1,
'hyper_parameters': '{}'
}
def setUp(self):
self.client.login(username=TEST_USERNAME, password=TEST_PASSWORD)
def test_new_session_form(self):
response = self.client.get(reverse('new_session', kwargs={'project_id': TEST_PROJECT_ID}))
self.assertEqual(response.status_code, 200)
def test_create_session_fail_invalidation(self):
form_addr = reverse('new_session', kwargs={'project_id': TEST_PROJECT_ID})
post_data = {}
response = self.client.post(form_addr, post_data)
self.assertEqual(response.status_code, 200)
self.assertFormError(response, 'form', 'name', "This field is required.")
def test_create_basic_session_ok(self):
form_addr = reverse('new_session', kwargs={'project_id': TEST_PROJECT_ID})
response = self.client.post(form_addr, self.post_data, follow=True)
self.assertEqual(response.status_code, 200)
session_id = response.context['session'].pk
self.assertRedirects(response, reverse('session',
kwargs={'project_id': TEST_PROJECT_ID,
'session_id': session_id}))
def test_create_tuning_session_ok(self):
form_addr = reverse('new_session', kwargs={'project_id': TEST_PROJECT_ID})
post_data = dict(self.post_data)
post_data.update(tuning_session='tuning_session')
response = self.client.post(form_addr, post_data, follow=True)
self.assertEqual(response.status_code, 200)
session_id = response.context['session'].pk
self.assertRedirects(response, reverse('session',
kwargs={'project_id': TEST_PROJECT_ID,
'session_id': session_id}))
def test_edit_session_fail_invalidation(self):
form_addr = reverse('edit_session', kwargs={'project_id': TEST_PROJECT_ID,
'session_id': TEST_BASIC_SESSION_ID})
post_data = {}
response = self.client.post(form_addr, post_data)
self.assertFormError(response, 'form', 'name', "This field is required.")
def test_edit_basic_session_ok(self):
form_addr = reverse('edit_session', kwargs={'project_id': TEST_PROJECT_ID,
'session_id': TEST_BASIC_SESSION_ID})
post_data = dict(self.post_data)
post_data.update(name='new_session_name')
response = self.client.post(form_addr, post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertRedirects(response, reverse('session',
kwargs={'project_id': TEST_PROJECT_ID,
'session_id': TEST_BASIC_SESSION_ID}))
def test_edit_all_knobs_ok(self):
response = self.client.get(reverse('edit_knobs',
kwargs={'project_id': TEST_PROJECT_ID,
'session_id': TEST_BASIC_SESSION_ID}))
self.assertEqual(response.status_code, 200)
def test_edit_knob_ok(self):
form_addr = reverse('edit_knobs', kwargs={'project_id': TEST_PROJECT_ID,
'session_id': TEST_BASIC_SESSION_ID})
post_data = {
'name': 'global.wal_writer_delay',
'minval': '1',
'maxval': '1000',
'tunable': 'on'
}
response = self.client.post(form_addr, post_data, follow=True)
self.assertEqual(response.status_code, 204)
def test_delete_zero_sessions(self):
form_addr = reverse('delete_session', kwargs={'project_id': TEST_PROJECT_ID})
post_data = {'sessions': []}
response = self.client.post(form_addr, post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertRedirects(response, reverse('project_sessions',
kwargs={'project_id': TEST_PROJECT_ID}))
def test_delete_one_session(self):
form_addr = reverse('delete_session', kwargs={'project_id': TEST_PROJECT_ID})
post_data = {'sessions': [TEST_BASIC_SESSION_ID]}
response = self.client.post(form_addr, post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertRedirects(response, reverse('project_sessions',
kwargs={'project_id': TEST_PROJECT_ID}))
def test_delete_multiple_sessions(self):
create_form_addr = reverse('new_session', kwargs={'project_id': TEST_PROJECT_ID})
session_ids = []
post_data = dict(self.post_data)
for i in range(5):
post_data.update(name='session_{}'.format(i))
response = self.client.post(create_form_addr, post_data, follow=True)
self.assertEqual(response.status_code, 200)
session_ids.append(response.context['session'].pk)
delete_form_addr = reverse('delete_session', kwargs={'project_id': TEST_PROJECT_ID})
post_data = {'sessions': session_ids}
response = self.client.post(delete_form_addr, post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertRedirects(response, reverse('project_sessions',
kwargs={'project_id': TEST_PROJECT_ID}))