Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
CIRCLE
/
cloud
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
94
Merge Requests
10
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
94ae9469
authored
Oct 14, 2014
by
Csók Tamás
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
selenium tests: fixes and template creation test added
parent
bf5b78a0
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
211 additions
and
29 deletions
+211
-29
circle/dashboard/tests/selenium/test_vm_controlls.py
+211
-29
No files found.
circle/dashboard/tests/selenium/test_vm_controlls.py
View file @
94ae9469
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright 2014 Budapest University of Technology and Economics (BME IK)
# Copyright 2014 Budapest University of Technology and Economics (BME IK)
#
#
# This file is part of CIRCLE Cloud.
# This file is part of CIRCLE Cloud.
...
@@ -19,11 +21,15 @@ from django.contrib.auth.models import User
...
@@ -19,11 +21,15 @@ from django.contrib.auth.models import User
import
random
import
random
import
urlparse
import
urlparse
import
re
import
re
import
time
from
selenium.webdriver.support.ui
import
WebDriverWait
from
selenium.webdriver.support.ui
import
WebDriverWait
from
selenium.webdriver.support
import
expected_conditions
as
EC
from
selenium.webdriver.support
import
expected_conditions
as
EC
from
selenium.webdriver.support.select
import
Select
from
selenium.webdriver.common.by
import
By
from
selenium.webdriver.common.by
import
By
random_pass
=
""
.
join
([
random
.
choice
(
random_pass
=
""
.
join
([
random
.
choice
(
'0123456789abcdefghijklmnopqrstvwxyz'
)
for
n
in
xrange
(
10
)])
'0123456789abcdefghijklmnopqrstvwxyz'
)
for
n
in
xrange
(
10
)])
random_accents
=
random_pass
+
""
.
join
([
random
.
choice
(
u"áéíöóúűÁÉÍÖÓÜÚŰ"
)
for
n
in
xrange
(
5
)])
wait_max_sec
=
10
wait_max_sec
=
10
host
=
'https:127.0.0.1'
host
=
'https:127.0.0.1'
...
@@ -52,28 +58,68 @@ class UtilityMixin(object):
...
@@ -52,28 +58,68 @@ class UtilityMixin(object):
password_input
.
clear
()
password_input
.
clear
()
password_input
.
send_keys
(
password
)
password_input
.
send_keys
(
password
)
submit_input
.
click
()
submit_input
.
click
()
try
:
# If selenium runs only in a small (virtual) screen
try
:
# If selenium runs only in a small (virtual) screen
driver
.
find_element_by_class_name
(
'navbar-toggle'
)
.
click
()
driver
.
find_element_by_class_name
(
'navbar-toggle'
)
.
click
()
WebDriverWait
(
self
.
driver
,
wait_max_sec
)
.
until
(
EC
.
element_to_be_clickable
((
By
.
CSS_SELECTOR
,
"a[href*='/dashboard/profile/']"
)))
except
:
except
:
pass
time
.
sleep
(
0.5
)
WebDriverWait
(
self
.
driver
,
wait_max_sec
)
.
until
(
EC
.
element_to_be_clickable
((
By
.
CSS_SELECTOR
,
"a[href*='/dashboard/profile/']"
)))
except
:
except
:
raise
Exception
(
'Selenium cannot find the form controls'
)
raise
Exception
(
'Selenium cannot find the form controls'
)
def
list_options
(
self
,
select
):
try
:
option_dic
=
{}
select
=
Select
(
select
)
for
option
in
select
.
options
:
key
=
option
.
get_attribute
(
'value'
)
if
key
is
not
None
and
key
:
option_dic
[
key
]
=
[
option
.
text
]
return
option_dic
except
:
raise
Exception
(
'Selenium cannot list the select possibilities'
)
def
select_option
(
self
,
select
,
what
=
None
):
try
:
my_choice
=
None
options
=
self
.
list_options
(
select
)
select
=
Select
(
select
)
if
what
is
not
None
:
for
key
,
value
in
options
.
iteritems
():
if
what
in
key
:
my_choice
=
key
else
:
if
isinstance
(
value
,
list
):
for
single_value
in
value
:
if
what
in
single_value
:
my_choice
=
key
else
:
if
what
in
value
:
my_choice
=
key
if
my_choice
is
None
:
my_choose_list
=
options
.
keys
()
my_choice
=
my_choose_list
[
random
.
randint
(
0
,
len
(
my_choose_list
)
-
1
)]
select
.
select_by_value
(
my_choice
)
except
:
raise
Exception
(
'Selenium cannot select the choosen one'
)
def
get_link_by_href
(
self
,
target_href
,
attributes
=
None
):
def
get_link_by_href
(
self
,
target_href
,
attributes
=
None
):
try
:
try
:
links
=
self
.
driver
.
find_elements_by_tag_name
(
'a'
)
links
=
self
.
driver
.
find_elements_by_tag_name
(
'a'
)
for
link
in
links
:
for
link
in
links
:
href
=
link
.
get_attribute
(
'href'
)
href
=
link
.
get_attribute
(
'href'
)
if
href
is
not
None
:
if
href
is
not
None
and
href
:
if
target_href
in
href
:
if
target_href
in
href
:
perfect_fit
=
True
perfect_fit
=
True
if
isinstance
(
attributes
,
dict
):
if
isinstance
(
attributes
,
dict
):
for
key
,
target_value
in
attributes
.
iteritems
():
for
key
,
target_value
in
attributes
.
iteritems
():
attr_check
=
link
.
get_attribute
(
key
)
attr_check
=
link
.
get_attribute
(
key
)
if
attr_check
is
not
None
:
if
attr_check
is
not
None
and
attr_check
:
if
target_value
not
in
attr_check
:
if
target_value
not
in
attr_check
:
perfect_fit
=
False
perfect_fit
=
False
if
perfect_fit
:
if
perfect_fit
:
...
@@ -82,6 +128,105 @@ class UtilityMixin(object):
...
@@ -82,6 +128,105 @@ class UtilityMixin(object):
raise
Exception
(
raise
Exception
(
'Selenium cannot find the href=
%
s link'
%
target_href
)
'Selenium cannot find the href=
%
s link'
%
target_href
)
def
click_on_link
(
self
,
link
):
"""
There are situations when selenium built in click() function
doesn't work as intended, that's when this function is used.
Fires a click event via javascript injection.
"""
try
:
# Javascript function to simulate a click on a link
javascript
=
(
"var link = arguments[0];"
"var cancelled = false;"
"if(document.createEvent) {"
" var event = document.createEvent(
\"
MouseEvents
\"
);"
" event.initMouseEvent("
"
\"
click
\"
, true, true, window, 0, 0, 0, 0, 0,"
" false,false,false,false,0,null);"
" cancelled = !link.dispatchEvent(event);"
"} else if(link.fireEvent) {"
" cancelled = !link.fireEvent(
\"
onclick
\"
);"
"} if (!cancelled) {"
" window.location = link.href;"
"}"
)
self
.
driver
.
execute_script
(
"
%
s"
%
javascript
,
link
)
except
:
raise
Exception
(
'Selenium cannot inject javascript to the page'
)
def
wait_and_accept_operation
(
self
,
argument
=
None
):
try
:
accept
=
WebDriverWait
(
self
.
driver
,
wait_max_sec
)
.
until
(
EC
.
element_to_be_clickable
((
By
.
ID
,
"op-form-send"
)))
if
argument
is
not
None
:
possible
=
self
.
driver
.
find_elements_by_css_selector
(
"div.controls > input[type='text']"
)
if
isinstance
(
argument
,
list
):
for
x
in
range
(
0
,
len
(
possible
)):
possible
[
x
]
.
clear
()
possible
[
x
]
.
send_keys
(
argument
[
x
%
len
(
argument
)])
else
:
for
form
in
possible
:
form
.
clear
()
form
.
send_keys
(
argument
)
accept
.
click
()
except
:
raise
Exception
(
"Selenium cannot accept the"
" operation confirmation"
)
def
create_base_template
(
self
,
name
=
None
,
architecture
=
"x86-64"
,
method
=
None
,
op_system
=
None
,
lease
=
None
,
network
=
"vm"
):
if
name
is
None
:
name
=
"template_
%
s"
%
random_accents
if
op_system
is
None
:
op_system
=
"!os
%
s"
%
random_accents
try
:
self
.
driver
.
get
(
'
%
s/dashboard/template/choose/'
%
host
)
self
.
driver
.
find_element_by_css_selector
(
"input[type='radio'][value='base_vm']"
)
.
click
()
next_button
=
self
.
driver
.
find_element_by_id
(
"template-choose-next-button"
)
next_button
.
click
()
template_name
=
WebDriverWait
(
self
.
driver
,
wait_max_sec
)
.
until
(
EC
.
visibility_of_element_located
((
By
.
ID
,
'id_name'
)))
template_name
.
clear
()
template_name
.
send_keys
(
name
)
self
.
select_option
(
self
.
driver
.
find_element_by_id
(
"id_arch"
),
architecture
)
self
.
select_option
(
self
.
driver
.
find_element_by_id
(
"id_access_method"
),
method
)
system_name
=
self
.
driver
.
find_element_by_id
(
"id_system"
)
system_name
.
clear
()
system_name
.
send_keys
(
op_system
)
self
.
select_option
(
self
.
driver
.
find_element_by_id
(
"id_lease"
),
lease
)
self
.
select_option
(
self
.
driver
.
find_element_by_id
(
"id_networks"
),
network
)
self
.
driver
.
find_element_by_css_selector
(
"input.btn[type='submit']"
)
.
click
()
WebDriverWait
(
self
.
driver
,
wait_max_sec
)
.
until
(
EC
.
visibility_of_element_located
((
By
.
ID
,
'ops'
)))
self
.
click_on_link
(
self
.
get_link_by_href
(
'/op/deploy/'
))
self
.
wait_and_accept_operation
()
self
.
click_on_link
(
WebDriverWait
(
self
.
driver
,
wait_max_sec
)
.
until
(
EC
.
element_to_be_clickable
((
By
.
CSS_SELECTOR
,
"a[href$='/op/shut_off/']"
))))
self
.
wait_and_accept_operation
()
WebDriverWait
(
self
.
driver
,
wait_max_sec
)
.
until
(
EC
.
element_to_be_clickable
((
By
.
CSS_SELECTOR
,
"a[href$='/op/deploy/']"
)))
self
.
click_on_link
(
self
.
get_link_by_href
(
'/op/save_as_template/'
))
self
.
wait_and_accept_operation
(
name
)
return
name
except
:
raise
Exception
(
'Selenium cannot create a base template virtual machine'
)
def
create_random_vm
(
self
):
def
create_random_vm
(
self
):
try
:
try
:
self
.
driver
.
get
(
'
%
s/dashboard/vm/create/'
%
host
)
self
.
driver
.
get
(
'
%
s/dashboard/vm/create/'
%
host
)
...
@@ -89,7 +234,6 @@ class UtilityMixin(object):
...
@@ -89,7 +234,6 @@ class UtilityMixin(object):
pk
=
None
pk
=
None
vm_list
=
self
.
driver
.
find_elements_by_class_name
(
vm_list
=
self
.
driver
.
find_elements_by_class_name
(
'vm-create-template-summary'
)
'vm-create-template-summary'
)
self
.
driver
.
save_screenshot
(
'screenie.png'
)
choice
=
random
.
randint
(
0
,
len
(
vm_list
)
-
1
)
choice
=
random
.
randint
(
0
,
len
(
vm_list
)
-
1
)
vm_list
[
choice
]
.
click
()
vm_list
[
choice
]
.
click
()
create
=
WebDriverWait
(
self
.
driver
,
wait_max_sec
)
.
until
(
create
=
WebDriverWait
(
self
.
driver
,
wait_max_sec
)
.
until
(
...
@@ -118,13 +262,13 @@ class UtilityMixin(object):
...
@@ -118,13 +262,13 @@ class UtilityMixin(object):
list_view_link
=
self
.
get_link_by_href
(
list_view_link
=
self
.
get_link_by_href
(
'#index-list-view'
,
'#index-list-view'
,
required_attributes
)
.
find_element_by_tag_name
(
'i'
)
required_attributes
)
.
find_element_by_tag_name
(
'i'
)
list_view_link
.
click
(
)
self
.
click_on_link
(
list_view_link
)
states
=
[
driver
.
execute_script
(
"
%
s"
%
js_script
,
list_view
),
states
=
[
driver
.
execute_script
(
"
%
s"
%
js_script
,
list_view
),
driver
.
execute_script
(
"
%
s"
%
js_script
,
graph_view
)]
driver
.
execute_script
(
"
%
s"
%
js_script
,
graph_view
)]
graph_view_link
.
click
(
)
self
.
click_on_link
(
graph_view_link
)
states
.
extend
([
driver
.
execute_script
(
"
%
s"
%
js_script
,
list_view
),
states
.
extend
([
driver
.
execute_script
(
"
%
s"
%
js_script
,
list_view
),
driver
.
execute_script
(
"
%
s"
%
js_script
,
graph_view
)])
driver
.
execute_script
(
"
%
s"
%
js_script
,
graph_view
)])
list_view_link
.
click
(
)
self
.
click_on_link
(
list_view_link
)
states
.
extend
([
driver
.
execute_script
(
"
%
s"
%
js_script
,
list_view
),
states
.
extend
([
driver
.
execute_script
(
"
%
s"
%
js_script
,
list_view
),
driver
.
execute_script
(
"
%
s"
%
js_script
,
graph_view
)])
driver
.
execute_script
(
"
%
s"
%
js_script
,
graph_view
)])
return
states
return
states
...
@@ -149,17 +293,23 @@ class UtilityMixin(object):
...
@@ -149,17 +293,23 @@ class UtilityMixin(object):
class
VmDetailTest
(
UtilityMixin
,
SeleniumTestCase
):
class
VmDetailTest
(
UtilityMixin
,
SeleniumTestCase
):
def
setUp
(
self
):
template_id
=
None
self
.
u1
=
User
.
objects
.
create
(
username
=
'test_
%
s'
%
random_pass
,
is_superuser
=
True
)
@classmethod
self
.
u1
.
set_password
(
random_pass
)
def
setup_class
(
cls
):
self
.
u1
.
save
()
cls
.
_user
=
User
.
objects
.
create
(
username
=
'test_
%
s'
%
random_accents
,
self
.
addCleanup
(
self
.
u1
.
delete
)
is_superuser
=
True
)
cls
.
_user
.
set_password
(
random_accents
)
cls
.
_user
.
save
()
@classmethod
def
teardown_class
(
cls
):
cls
.
_user
.
delete
()
def
test_01_login
(
self
):
def
test_01_login
(
self
):
title
=
'Dashboard | CIRCLE'
title
=
'Dashboard | CIRCLE'
location
=
'/dashboard/'
location
=
'/dashboard/'
self
.
login
(
'test_
%
s'
%
random_
pass
,
random_pas
s
)
self
.
login
(
'test_
%
s'
%
random_
accents
,
random_accent
s
)
self
.
driver
.
get
(
'
%
s/dashboard/'
%
host
)
self
.
driver
.
get
(
'
%
s/dashboard/'
%
host
)
url
=
urlparse
.
urlparse
(
self
.
driver
.
current_url
)
url
=
urlparse
.
urlparse
(
self
.
driver
.
current_url
)
(
self
.
assertIn
(
'
%
s'
%
title
,
self
.
driver
.
title
,
(
self
.
assertIn
(
'
%
s'
%
title
,
self
.
driver
.
title
,
...
@@ -167,8 +317,38 @@ class VmDetailTest(UtilityMixin, SeleniumTestCase):
...
@@ -167,8 +317,38 @@ class VmDetailTest(UtilityMixin, SeleniumTestCase):
self
.
assertEqual
(
url
.
path
,
'
%
s'
%
location
,
self
.
assertEqual
(
url
.
path
,
'
%
s'
%
location
,
'URL path is not equal with
%
s'
%
location
))
'URL path is not equal with
%
s'
%
location
))
def
test_02_able_to_create_vm
(
self
):
def
test_02_able_to_create_template
(
self
):
self
.
login
(
'test_
%
s'
%
random_pass
,
random_pass
)
self
.
login
(
'test_
%
s'
%
random_accents
,
random_accents
)
template_list
=
None
create_template
=
self
.
get_link_by_href
(
'/dashboard/template/choose/'
)
self
.
click_on_link
(
create_template
)
WebDriverWait
(
self
.
driver
,
wait_max_sec
)
.
until
(
EC
.
visibility_of_element_located
((
By
.
ID
,
'create-modal'
)))
template_list
=
self
.
driver
.
find_elements_by_class_name
(
'template-choose-list-element'
)
print
'Selenium found
%
s template possibilities'
%
len
(
template_list
)
(
self
.
assertIsNotNone
(
template_list
,
"Selenium can not find the create template list"
)
or
self
.
assertGreater
(
len
(
template_list
),
0
,
"The create template list is empty"
))
def
test_03_create_base_vm
(
self
):
self
.
login
(
'test_
%
s'
%
random_accents
,
random_accents
)
template_name
=
self
.
create_base_template
()
self
.
driver
.
get
(
'
%
s/dashboard/template/list/'
%
host
)
templates
=
self
.
driver
.
find_elements_by_css_selector
(
"td.name"
)
found
=
False
for
template
in
templates
:
if
template_name
in
template
.
text
:
found
=
True
self
.
template_id
=
re
.
search
(
r'\d+'
,
template
.
text
)
.
group
()
self
.
assertTrue
(
found
,
"Coud not found the created template in the template list"
)
def
test_10_able_to_create_vm
(
self
):
self
.
login
(
'test_
%
s'
%
random_accents
,
random_accents
)
vm_list
=
None
vm_list
=
None
create_vm_link
=
self
.
get_link_by_href
(
'/dashboard/vm/create/'
)
create_vm_link
=
self
.
get_link_by_href
(
'/dashboard/vm/create/'
)
create_vm_link
.
click
()
create_vm_link
.
click
()
...
@@ -177,18 +357,20 @@ class VmDetailTest(UtilityMixin, SeleniumTestCase):
...
@@ -177,18 +357,20 @@ class VmDetailTest(UtilityMixin, SeleniumTestCase):
By
.
ID
,
'create-modal'
)))
By
.
ID
,
'create-modal'
)))
vm_list
=
self
.
driver
.
find_elements_by_class_name
(
vm_list
=
self
.
driver
.
find_elements_by_class_name
(
'vm-create-template-summary'
)
'vm-create-template-summary'
)
print
'Selenium found
%
s template possibilities'
%
len
(
vm_list
)
print
(
"Selenium found
%(vm_number)
s virtual machine template "
" possibilities"
%
{
'vm_number'
:
len
(
vm_list
)})
(
self
.
assertIsNotNone
(
(
self
.
assertIsNotNone
(
vm_list
,
"Selenium can not find the VM list"
)
or
vm_list
,
"Selenium can not find the VM list"
)
or
self
.
assertGreater
(
len
(
vm_list
),
0
,
"The create VM list is empty"
))
self
.
assertGreater
(
len
(
vm_list
),
0
,
"The create VM list is empty"
))
def
test_
03
_create_vm
(
self
):
def
test_
11
_create_vm
(
self
):
self
.
login
(
'test_
%
s'
%
random_
pass
,
random_pas
s
)
self
.
login
(
'test_
%
s'
%
random_
accents
,
random_accent
s
)
pk
=
self
.
create_random_vm
()
pk
=
self
.
create_random_vm
()
self
.
assertIsNotNone
(
pk
,
"Can not create a VM"
)
self
.
assertIsNotNone
(
pk
,
"Can not create a VM"
)
def
test_
04
_vm_view_change
(
self
):
def
test_
12
_vm_view_change
(
self
):
self
.
login
(
'test_
%
s'
%
random_
pass
,
random_pas
s
)
self
.
login
(
'test_
%
s'
%
random_
accents
,
random_accent
s
)
expected_states
=
[
""
,
"none"
,
expected_states
=
[
""
,
"none"
,
"none"
,
""
,
"none"
,
""
,
"block"
,
"none"
]
"block"
,
"none"
]
...
@@ -198,8 +380,8 @@ class VmDetailTest(UtilityMixin, SeleniumTestCase):
...
@@ -198,8 +380,8 @@ class VmDetailTest(UtilityMixin, SeleniumTestCase):
self
.
assertListEqual
(
states
,
expected_states
,
self
.
assertListEqual
(
states
,
expected_states
,
"The view mode does not change for VM listing"
)
"The view mode does not change for VM listing"
)
def
test_
05
_node_view_change
(
self
):
def
test_
13
_node_view_change
(
self
):
self
.
login
(
'test_
%
s'
%
random_
pass
,
random_pas
s
)
self
.
login
(
'test_
%
s'
%
random_
accents
,
random_accent
s
)
expected_states
=
[
""
,
"none"
,
expected_states
=
[
""
,
"none"
,
"none"
,
""
,
"none"
,
""
,
"block"
,
"none"
]
"block"
,
"none"
]
...
@@ -209,7 +391,7 @@ class VmDetailTest(UtilityMixin, SeleniumTestCase):
...
@@ -209,7 +391,7 @@ class VmDetailTest(UtilityMixin, SeleniumTestCase):
self
.
assertListEqual
(
states
,
expected_states
,
self
.
assertListEqual
(
states
,
expected_states
,
"The view mode does not change for NODE listing"
)
"The view mode does not change for NODE listing"
)
def
test_
06
_delete_vm
(
self
):
def
test_
14
_delete_vm
(
self
):
self
.
login
(
'test_
%
s'
%
random_
pass
,
random_pas
s
)
self
.
login
(
'test_
%
s'
%
random_
accents
,
random_accent
s
)
pk
=
self
.
create_random_vm
()
pk
=
self
.
create_random_vm
()
self
.
assertTrue
(
self
.
delete_vm
(
pk
),
"Can not delete a VM"
)
self
.
assertTrue
(
self
.
delete_vm
(
pk
),
"Can not delete a VM"
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment