forked from jon-jacky/PyModel
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStepper.py
More file actions
142 lines (112 loc) · 4.02 KB
/
Stepper.py
File metadata and controls
142 lines (112 loc) · 4.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
"""
WebApplication stepper (test harness)
"""
import re
import urllib.request, urllib.parse, urllib.error
import urllib.request, urllib.error, urllib.parse
import http.cookiejar
# Default stepper configuration for
# webapp.py running on localhost at port 8080
site = 'http://localhost:8000/'
path = ''
webAppPage = 'webapp.py'
logoutPage = 'logout.py'
webAppUrl = site + path + webAppPage
logoutUrl = site + path + logoutPage
# user in model : user in implementation
users = { "OleBrumm":"user1", "VinniPuhh":"user2" }
passwords = { "user1":"123", "user2":"234" }
wrongPassword = "000"
debuglevel = 0 # for debug_handler 1: print HTTP headers, 0: don't print
show_page = False
# Optionally rebind configuration. If no Config module found, retain defaults.
try:
from Config import *
except ImportError:
pass
print('webAppUrl: %s' % webAppUrl) # show which config file (if any)
# handlers that are the same for all users
redirect_handler= urllib.request.HTTPRedirectHandler()
debug_handler = urllib.request.HTTPHandler(debuglevel=debuglevel)
# handlers that are different for each user are part of the session state
class Session(object):
"""
One user's session state: cookies and handlers
"""
def __init__(self):
self.cookies = http.cookiejar.CookieJar()
self.cookie_handler = urllib.request.HTTPCookieProcessor(self.cookies)
self.opener = urllib.request.build_opener(self.cookie_handler,
redirect_handler,debug_handler)
session = dict() # each user's Session
# helpers, determine test results by scraping the page
# like in NModel WebApplication WebTestHelper
def loginFailed(page):
return (page.find('Incorrect login') > -1)
# not in NModel WebApplication, it has no positive check for login success
def loginSuccess(page):
return (page.find('DoStuff') > -1)
# similar to NModel WebApplication WebTestHelper
intPattern = re.compile(r'Number: (\d+)')
def intContents(page):
m = intPattern.search(page)
if m:
return int(m.group(1))
# stepper core
def TestAction(aname, args, modelResult):
"""
To indicate success, no return statement (or return None)
To indicate failure, return string that explains failure
Test runner also treats unhandled exceptions as failures
"""
global session
if aname == 'Initialize':
session = dict() # clear out cookies/session IDs from previous session
elif aname == 'Login':
user = users[args[0]]
if user not in session:
session[user] = Session()
password = passwords[user] if args[1] == 'Correct' else wrongPassword
postArgs = urllib.parse.urlencode({'username':user, 'password':password})
# GET login page
page = session[user].opener.open(webAppUrl).read()
if show_page:
print(page)
# POST username, password
page = session[user].opener.open(webAppUrl, postArgs).read()
if show_page:
print(page)
# Check conformance, reproduce NModel WebApplication Stepper logic:
# check for login failed message, no check for positive indication of login
result = 'Success'
if loginFailed(page):
result = 'Failure'
if result != modelResult:
return 'received Login %s, expected %s' % (result, modelResult)
elif aname == 'Logout':
user = users[args[0]]
page = session[user].opener.open(logoutUrl).read()
del session[user] # clear out cookie/session ID
if show_page:
print(page)
elif aname == 'UpdateInt':
user = users[args[0]]
numArg = urllib.parse.urlencode({'num':args[1]})
page = session[user].opener.open("%s?%s" % (webAppUrl,numArg)).read()
if show_page:
print(page)
elif aname == 'ReadInt':
user = users[args[0]]
page = session[user].opener.open(webAppUrl).read()
if show_page:
print(page)
numInPage = intContents(page)
if numInPage != modelResult: # check conformance
return 'found %s in page, expected %s' % (numInPage, modelResult)
else:
return None
else:
raise NotImplementedError('action %s not handled by stepper' % aname)
def Reset():
global session
session.clear()