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
A prog2-höz tartozó friss repo anyagok itt elérhetőek:
https://git.iit.bme.hu/
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