Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: sitescripts/formmail/test/test_formmail2.py.orig

Issue 29374647: Issue 4814 - Adds csv log to formmail2 (Closed) Base URL: https://hg.adblockplus.org/sitescripts
Patch Set: Created Feb. 13, 2017, 12:54 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 # This file is part of the Adblock Plus web scripts,
Sebastian Noack 2017/02/14 09:54:14 It seems this file has been added by accident.
Jon Sonesen 2017/02/20 09:55:16 Acknowledged.
2 # Copyright (C) 2006-2016 Eyeo GmbH
3 #
4 # Adblock Plus is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License version 3 as
6 # published by the Free Software Foundation.
7 #
8 # Adblock Plus is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
15
16 from urllib import urlencode
17 from urllib2 import urlopen, HTTPError
18
19 import pytest
20 import datetime
21 from wsgi_intercept import (urllib_intercept, add_wsgi_intercept,
22 remove_wsgi_intercept)
23 from csv import DictReader
24 from sitescripts.formmail.web import formmail2
25
26
27 @pytest.fixture()
28 def form_config():
29 return formmail2.conf_parse(formmail2.get_config_items())['test']
30
31
32 @pytest.fixture()
33 def form_handler(form_config, log_path):
34 # override configured path to log file with tmpdir path
35 form_config['csv_log'].value = log_path
36 return formmail2.make_handler('test', form_config)[1]
37
38
39 @pytest.fixture()
40 def log_path(form_config, tmpdir):
41 log = tmpdir.mkdir('logs').join('test.csv_log')
42 return str(log)
43
44
45 # We make this a fixture instead of a constant so we can modify it in each
46 # test as needed without affecting other tests.
47 @pytest.fixture
48 def form_data():
49 return {
50 'email': 'john_doe@gmail.com',
51 'mandatory': 'john_doe@gmail.com',
52 'non_mandatory_message': 'Once upon a time\nthere lived a king.',
53 'non_mandatory_email': 'test@test.com',
54 }
55
56
57 @pytest.fixture()
58 def response_for(form_handler, log_path):
59 host, port = 'test.local', 80
60 urllib_intercept.install_opener()
61 add_wsgi_intercept(host, port, lambda: form_handler)
62 url = 'http://{}:{}'.format(host, port)
63
64 def response_for(data):
65 if data is None:
66 response = urlopen(url)
67 else:
68 response = urlopen(url, urlencode(data))
69 return response.code, response.read()
70
71 yield response_for
72 remove_wsgi_intercept()
73
74
75 def test_config_parse(form_config):
76 assert form_config['url'].value == 'test/apply/submit'
77 assert form_config['fields']['email'].value == 'mandatory, email'
78
79
80 def test_success(response_for, form_data, mocker):
81 sm_mock = mocker.patch('sitescripts.formmail.web.formmail2.sendMail')
82 assert response_for(form_data) == (200, '')
83 assert sm_mock.call_count == 1
84 params = sm_mock.call_args[0][1]['fields']
85 assert set(params.keys()) == set(form_data.keys())
86 for key, value in form_data.items():
87 assert params[key] == value
88
89
90 def test_non_mandatory_no_msg(response_for, form_data, mocker):
91 mocker.patch('sitescripts.formmail.web.formmail2.sendMail')
92 form_data['non_mandatory'] = ''
93 assert response_for(form_data) == (200, '')
94
95
96 def test_invalid_email_cstm_msg(response_for, form_data, mocker, form_config):
97 mocker.patch('sitescripts.formmail.web.formmail2.sendMail')
98 form_data['email'] = 'bademail'
99 with pytest.raises(HTTPError) as error:
100 response_for(form_data)
101 assert error.value.read() == 'You failed the email validation'
102
103
104 def test_valid_nan_mandatory_email(response_for, form_data, mocker):
105 mocker.patch('sitescripts.formmail.web.formmail2.sendMail')
106 form_data['non_mandatory_email'] = 'asfaf'
107 with pytest.raises(HTTPError) as error:
108 response_for(form_data)
109 assert error.value.read() == 'Invalid email'
110
111 del form_data['non_mandatory_email']
112 assert response_for(form_data) == (200, '')
113
114
115 def test_mandatory_fail_dflt_msg(response_for, form_data, mocker):
116 mocker.patch('sitescripts.formmail.web.formmail2.sendMail')
117 del form_data['mandatory']
118 with pytest.raises(HTTPError) as error:
119 response_for(form_data)
120 assert error.value.read() == 'No mandatory entered'
121
122
123 def test_collect_with_tmpl(log_path, form_data):
124 form_data['time'] = 'test'
125 formmail2.collect_formdata(form_data, log_path)
126 with open(log_path) as csvfile:
127 reader = DictReader(csvfile)
128 row = reader.next()
129 assert row == form_data
130
131
132 def test_collect_no_tmpl(log_path, form_data, form_config):
133 del(form_config['template'])
134 form_data['time'] = 'test'
135 formmail2.collect_formdata(form_data, log_path)
136 with open(log_path) as csvfile:
137 reader = DictReader(csvfile)
138 row = reader.next()
139 assert row == form_data
140
141
142 def test_fieldnames(log_path, form_data):
143 form_data['time'] = str(datetime.datetime.now())
144 formmail2.collect_formdata(form_data, log_path)
145 with open(log_path) as csvfile:
146 reader = DictReader(csvfile)
147 for field in reader.fieldnames:
148 assert field in tuple(form_data.keys())
149
150
151 def test_field_err(form_config, form_data, log_path):
152 """
153 Submits a form that does not have the dame fields as previous submissions
154 that have the same form name, asserts that proper message is returned and
155 the row was properly written
156 """
157 formmail2.collect_formdata(form_data, log_path)
158 del(form_config['fields']['email'])
159 del(form_data['email'])
160 try:
161 formmail2.collect_formdata(form_data, log_path)
162 except Exception as e:
163 assert e.message == \
164 'Field names have changed, error log written to {}'\
165 .format(log_path + '_error')
166
167 with open(log_path+'_error') as error_log:
168 reader = DictReader(error_log)
169 assert reader.next() == form_data
170
171
172 def test_append_field_err(form_config, form_data, log_path):
173 """
174 Submits two identical forms that do not match the previous fields
175 found in the log file, triggering two rows to be added to the error
176 log and asserting the proper message is returned and that the rows
177 were written as expected
178 """
179 formmail2.collect_formdata(form_data, log_path)
180 del(form_config['fields']['email'])
181 del(form_data['email'])
182 try:
183 formmail2.collect_formdata(form_data, log_path)
184 except Exception as e:
185 pass
186 try:
187 formmail2.collect_formdata(form_data, log_path)
188 except Exception as e:
189 assert e.message == \
190 'Field names have changed, error log appended to {}'\
191 .format(log_path + '_error')
192
193 with open(log_path+'_error') as error_log:
194 reader = DictReader(error_log)
195 # two identical rows should be in the rror log
196 assert reader.next() == form_data
197 assert reader.next() == form_data
198
199
200 def test_append_log(form_data, log_path):
201 """
202 collect data twice, altering a field in the second call
203 assert that the 2nd row is equal to the resulting form data
204 """
205 form_data['time'] = str(datetime.datetime.now())
206 formmail2.collect_formdata(form_data, log_path)
207 form_data['email'] = 'test@foo.com'
208 formmail2.collect_formdata(form_data, log_path)
209 with open(log_path) as csvfile:
210 reader = DictReader(csvfile, fieldnames=form_data.keys())
211 # header
212 reader.next()
213 row1 = reader.next()
214 row2 = reader.next()
215
216 assert row2['email'] == form_data['email']
217 assert row2['email'] != row1['email']
OLDNEW

Powered by Google App Engine
This is Rietveld