-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathtest_lookup_errors.py
More file actions
46 lines (37 loc) · 7.87 KB
/
Copy pathtest_lookup_errors.py
File metadata and controls
46 lines (37 loc) · 7.87 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
import base64
import unittest
import flaskr.nscope.test.abstract_endpoint_test as abstract_endpoint_test
# According to the OEIS wiki, "The A-number A000000 is inadmissible". That
# should make A000000 a relatively stable example of a non-existent sequence.
#
# https://oeis.org/wiki/A-numbers
#
expected_oeis_response_b64 = 'PCBHRVQgL0EwMDAwMDAvYjAwMDAwMC50eHQgSFRUUC8xLjENCjwgSG9zdDogb2Vpcy5vcmcNCjwgVXNlci1BZ2VudDogcHl0aG9uLXJlcXVlc3RzLzIuMzIuMw0KPCBBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGUNCjwgQWNjZXB0OiAqLyoNCjwgQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KPCANCg0KPiBIVFRQLzEuMSA0MDQgTm90IEZvdW5kDQo+IENhY2hlLUNvbnRyb2w6IHByaXZhdGUsIG5vLXN0b3JlDQo+IENvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04DQo+IERhdGU6IFRodSwgMTEgQXByIDIwMjQgMjM6NTk6NDUgR01UDQo+IFZhcnk6ICoNCj4gVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNCj4gDQoKPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8aHRtbD4KICAKICA8aGVhZD4KICA8c2NyaXB0IGRlZmVyIGRhdGEtZG9tYWluPSJvZWlzLm9yZyIgc3JjPSJodHRwczovL3BsYXVzaWJsZS5pby9qcy9zY3JpcHQuanMiPjwvc2NyaXB0PgogIDxzdHlsZT4KICB0dCB7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMTAwJTsgfQogIHAuZWRpdGluZyB7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IG1hcmdpbjogMTBweDsgdGV4dC1pbmRlbnQ6IC0xMHB4OyB3b3JkLXdyYXA6YnJlYWstd29yZDt9CiAgcCB7IHdvcmQtd3JhcDogYnJlYWstd29yZDsgfQogIGRpdi5tb3RkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdpZHRoOiA3MCU7IGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmNjOyBtYXJnaW46IDFlbTsgfQogIHRkLm1vdGQgeyAgfQogIHAuU2VxLCBkaXYuU2VxIHsgdGV4dC1pbmRlbnQ6IC0xZW07IG1hcmdpbi1sZWZ0OiAxZW07IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDA7IH0KICBwLlNlcSB0dCwgZGl2LlNlcSB0dCB7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQogIDwvc3R5bGU+CiAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgogIDxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJPRUlTLGludGVnZXIgc2VxdWVuY2VzLFNsb2FuZSIgLz4KICAKICAKICA8dGl0bGU+VGhlIE9uLUxpbmUgRW5jeWNsb3BlZGlhIG9mIEludGVnZXIgU2VxdWVuY2VzJnJlZzsgKE9FSVMmcmVnOyk8L3RpdGxlPgogIDxsaW5rIHJlbD0ic2VhcmNoIiB0eXBlPSJhcHBsaWNhdGlvbi9vcGVuc2VhcmNoZGVzY3JpcHRpb24reG1sIiB0aXRsZT0iT0VJUyIgaHJlZj0iL29laXMueG1sIj4KICA8c2NyaXB0PgogIHZhciBteVVSTCA9ICJcL0EwMDAwMDBcL2IwMDAwMDAudHh0IgogIGZ1bmN0aW9uIHJlZGlyKCkgewogICAgICB2YXIgaG9zdCA9IGRvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lOwogICAgICBpZihob3N0ICE9ICJvZWlzLm9yZyIgJiYgaG9zdCAhPSAiMTI3LjAuMC4xIiAmJiBob3N0ICE9ICJsb2NhbGhvc3QiICYmIGhvc3QgIT0gImxvY2FsaG9zdC5sb2NhbGRvbWFpbiIpIHsKICAgICAgICAgIGRvY3VtZW50LmxvY2F0aW9uID0gImh0dHBzIisiOiIrIi8vIisib2VpcyIrIi5vcmcvIiArIG15VVJMOwogICAgICB9CiAgfQogIGZ1bmN0aW9uIHNmKCkgewogICAgICBpZihkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZSA9PSAiLyIgJiYgZG9jdW1lbnQuZikgZG9jdW1lbnQuZi5xLmZvY3VzKCk7CiAgfQogIDwvc2NyaXB0PgogIDwvaGVhZD4KICA8Ym9keSBiZ2NvbG9yPSNmZmZmZmYgb25sb2FkPSJyZWRpcigpO3NmKCkiPgogICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+PHRkIHdpZHRoPSIxMDAlIiBhbGlnbj0icmlnaHQiPgogICAgICA8Zm9udCBzaXplPS0xPgogICAgICAKICAgICAgICA8YSBocmVmPSIvbG9naW4/cmVkaXJlY3Q9JTJmQTAwMDAwMCUyZmIwMDAwMDAudHh0Ij5sb2dpbjwvYT4KICAgICAgCiAgICAgIDwvZm9udD4KICAgIDx0ciBoZWlnaHQ9NT48dGQ+CiAgICA8L3RhYmxlPgoKICAgIDxjZW50ZXI+CjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zaXplOiA4MyU7IGZvbnQtc3R5bGU6IGl0YWxpYyI+VGhlIE9FSVMgaXMgc3VwcG9ydGVkIGJ5IDxhIGhyZWY9Imh0dHA6Ly9vZWlzZi5vcmcvI0RPTkFURSI+dGhlIG1hbnkgZ2VuZXJvdXMgZG9ub3JzIHRvIHRoZSBPRUlTIEZvdW5kYXRpb248L2E+Ljwvc3Bhbj4KICAgIDxicj4KPHAgc3R5bGU9Im1hcmdpbi10b3A6LTI0cHgiPiZuYnNwOzwvcD4KPGEgaHJlZj0iLyI+PGltZyBib3JkZXI9IjAiIHdpZHRoPSI2MDAiIGhlaWdodD0iMTEwIiBzcmM9Ii9iYW5uZXIyMDIxLmpwZyIgYWx0PSJMb2dvIj48L2E+CiAgICA8YnI+CgoKCgoKCiAgICA8IS0tIG5vIHNwZWNpYWwgZm9udHMgLS0+CiAgICA8L2NlbnRlcj4KCiAgICA8Y2VudGVyPgogICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICAgICAgPHRyPjx0ZD4KICAgICAgICAKICAgIAogICAgPGNlbnRlcj4KICAgICAgICA8Zm9ybSBuYW1lPWYgYWN0aW9uPSIvc2VhcmNoIiBtZXRob2Q9IkdFVCI+CiAgICAgICAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+CiAgICAgICAgICAgIDx0cj48dGQ+CiAgICAgICAgICAgIDxpbnB1dCBtYXhMZW5ndGg9MTAyNCBzaXplPTU1IG5hbWU9cSB2YWx1ZT0iIiB0aXRsZT0iU2VhcmNoIFF1ZXJ5Ij4KICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iU2VhcmNoIiBuYW1lPWdvPgogICAgICAgICAgICA8dGQgd2lkdGg9MTA+PHRkPgogICAgICAgICAgICA8Zm9udCBzaXplPS0yPjxhIGhyZWY9Ii9oaW50cy5odG1sIj5IaW50czwvYT48L2ZvbnQ+CiAgICAgICAgICAgIDx0cj48dGQgY29sc3Bhbj0yPgogICAgICAgICAgICA8Zm9udCBzaXplPS0xPgogICAgICAgICAgICAgICAgKEdyZWV0aW5ncyBmcm9tIDxhIGhyZWY9Ii93ZWxjb21lIj5UaGUgT24tTGluZSBFbmN5Y2xvcGVkaWEgb2YgSW50ZWdlciBTZXF1ZW5jZXM8L2E+ISkKICAgICAgICAgICAgPC9mb250PgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZm9ybT4KICAgIDwvY2VudGVyPgoKICAgIDxiPlNvcnJ5LCB0aGUgcGFnZSB5b3UgcmVxdWVzdGVkIHdhcyBub3QgZm91bmQuCiAgICBUcnkgdGhlIHNlYXJjaCBib3ggYXQgdGhlIHRvcCBvZiB0aGlzIHBhZ2UuPC9iPgoKICAgICAgPC90ZD48L3RyPgogICAgPC90YWJsZT4KICAgIDwvY2VudGVyPgoKICAgIDxwPgoKICAgIDxjZW50ZXI+CiAgICAgIDxhIGhyZWY9Ii8iPkxvb2t1cDwvYT4gfAogICAgICA8YSBocmVmPSIvd2lraS9XZWxjb21lIj48Zm9udCBjb2xvcj0icmVkIj5XZWxjb21lPC9mb250PjwvYT4gfAogICAgICA8YSBocmVmPSIvd2lraS9NYWluX1BhZ2UiPjxmb250IGNvbG9yPSJyZWQiPldpa2k8L2ZvbnQ+PC9hPiB8CiAgICAgIDxhIGhyZWY9Ii93aWtpL1NwZWNpYWw6UmVxdWVzdEFjY291bnQiPlJlZ2lzdGVyPC9hPiB8CiAgICAgIAogICAgICA8YSBocmVmPSIvcGxheS5odG1sIj5NdXNpYzwvYT4gfAogICAgICA8YSBocmVmPSIvcGxvdDIuaHRtbCI+UGxvdCAyPC9hPiB8CiAgICAgIDxhIGhyZWY9Ii9kZW1vMS5odG1sIj5EZW1vczwvYT4gfAogICAgICA8YSBocmVmPSIvd2lraS9JbmRleF90b19PRUlTIj5JbmRleDwvYT4gfAogICAgICA8YSBocmVmPSIvU2Jyb3dzZS5odG1sIj5Ccm93c2U8L2E+IHwKICAgICAgPGEgaHJlZj0iL21vcmUuaHRtbCI+TW9yZTwvYT4gfAogICAgICA8YSBocmVmPSIvd2ViY2FtIj5XZWJDYW08L2E+CgogICAgICA8YnI+CgogICAgICA8YSBocmVmPSIvU3VibWl0Lmh0bWwiPkNvbnRyaWJ1dGUgbmV3IHNlcS4gb3IgY29tbWVudDwvYT4gfAogICAgICA8YSBocmVmPSIvZWlzaGVscDIuaHRtbCI+Rm9ybWF0PC9hPiB8CiAgICAgIDxhIGhyZWY9Ii93aWtpL1N0eWxlX1NoZWV0Ij5TdHlsZSBTaGVldDwvYT4gfAogICAgICA8YSBocmVmPSIvdHJhbnNmb3Jtcy5odG1sIj5UcmFuc2Zvcm1zPC9hPiB8CiAgICAgIDxhIGhyZWY9Ii9vbC5odG1sIj5TdXBlcnNlZWtlcjwvYT4gfAogICAgICA8YSBocmVmPSIvcmVjZW50Ij5SZWNlbnRzPC9hPgoKICAgICAgPGJyPgoKICAgICAgPGEgaHJlZj0iL2NvbW11bml0eS5odG1sIj5UaGUgT0VJUyBDb21tdW5pdHk8L2E+IHwKICAgICAgTWFpbnRhaW5lZCBieSA8YSBocmVmPSJodHRwOi8vb2Vpc2Yub3JnIj5UaGUgT0VJUyBGb3VuZGF0aW9uIEluYy48L2E+CiAgICA8L2NlbnRlcj4KCiAgICA8cD4KICAgIDxjZW50ZXI+CiAgIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zaXplOiA4MyU7IGZvbnQtc3R5bGU6IGl0YWxpYyI+CiAgICA8YSBocmVmPSIvd2lraS9MZWdhbF9Eb2N1bWVudHMiPgogICAgTGljZW5zZSBBZ3JlZW1lbnRzLCBUZXJtcyBvZiBVc2UsIFByaXZhY3kgUG9saWN5LgogICAgPC9hPi4KICAgIDwvc3Bhbj4KICAgIDwvY2VudGVyPgoKICAgIDxwPgogICAgPGNlbnRlcj4KICAgIDxmb250IHNpemU9LTE+TGFzdCBtb2RpZmllZCBBcHJpbCAxMSAxOTozMiBFRFQgMjAyNC4gIENvbnRhaW5zIDM3MTYxOSBzZXF1ZW5jZXMuIChSdW5uaW5nIG9uIG9laXM0Lik8L2ZvbnQ+CiAgICA8L2NlbnRlcj4KICAgIDxwPgoKICA8L2JvZHk+CjwvaHRtbD4K'
# take an HTTP response, in base 64 format, and extract the headers up to the
# 'Date' key. see `process_log_entry` for usage
def process_response(response_b64):
response_bytes = base64.b64decode(response_b64)
beginning = response_bytes.split(b'> Date:', 1)[0]
return base64.b64encode(beginning).decode('ascii')
class TestNonexistentSequence(abstract_endpoint_test.AbstractEndpointTest):
endpoint = 'http://localhost:5000/api/get_oeis_values/A000000/12'
expected_response = "Error: B-file for ID 'A000000' not found in OEIS."
maxDiff = None
expected_log_output = [
{
'event': 'request issue',
'log_level': 'error',
'response': process_response(expected_oeis_response_b64),
'tags': ['http error']
}
]
def process_log_entry(self, entry):
# an HTTP response includes a time-dependent 'Date' parameter. in addition,
# the OEIS 404 page ends with a frequently updated paragraph that shows the
# time of the last update and the current number of sequences, and it can
# sometimes begin with a site notification banner. to allow the test to use
# a fixed response value in the expected log entry, we only check the very
# beginning of the response: the headers up to the 'Date' key
entry['response'] = process_response(entry['response'])
if __name__ == "__main__":
unittest.main()