更新
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
"""Offline regression tests for release validation; never connects to production."""
|
||||
import importlib.util
|
||||
import sys
|
||||
import types
|
||||
import unittest
|
||||
import urllib.error
|
||||
from email.message import Message
|
||||
from pathlib import Path
|
||||
from unittest.mock import patch
|
||||
|
||||
|
||||
spec = importlib.util.spec_from_file_location(
|
||||
'publish_test_users', Path(__file__).with_name('baota_publish_test_users.py'))
|
||||
release = importlib.util.module_from_spec(spec)
|
||||
with patch.dict(sys.modules, {
|
||||
'pymysql': types.ModuleType('pymysql'),
|
||||
'pwd': types.ModuleType('pwd'),
|
||||
}):
|
||||
spec.loader.exec_module(release)
|
||||
|
||||
|
||||
class CacheHeaderValidationTest(unittest.TestCase):
|
||||
def validate(self, cache_values):
|
||||
def fake_query(conn, sql, args=()):
|
||||
if 'GROUP BY p.gender' in sql:
|
||||
return ((1, 50), (2, 50))
|
||||
if 'DISTINCT p.avatar_url' in sql:
|
||||
return tuple((release.DOMAIN + '/uploads/%d-1.png' % i,) for i in range(10))
|
||||
if 'password_hash' in sql:
|
||||
return ((100,),)
|
||||
self.fail('Unexpected database query')
|
||||
|
||||
def fake_fetch(path):
|
||||
headers = Message()
|
||||
if path.startswith('/uploads/'):
|
||||
headers['Content-Type'] = 'image/png'
|
||||
return 200, headers, b'\x89PNG\r\n\x1a\n'
|
||||
if path in ['/admin/', '/app/']:
|
||||
headers['Content-Type'] = 'text/html'
|
||||
for value in cache_values:
|
||||
headers['Cache-Control'] = value
|
||||
return 200, headers, b'<!doctype html><html></html>'
|
||||
raise urllib.error.HTTPError(path, 401, 'Unauthorized', headers, None)
|
||||
|
||||
with patch.object(release, 'query', fake_query), patch.object(release, 'fetch', fake_fetch), patch.object(release, 'health'):
|
||||
return release.verify(object())
|
||||
|
||||
def test_accepts_no_store_in_second_cache_header(self):
|
||||
result = self.validate(['no-cache', 'no-store, no-cache, must-revalidate'])
|
||||
self.assertEqual(result['total'], 100)
|
||||
self.assertEqual(result['avatarsHttp200'], 10)
|
||||
|
||||
def test_accepts_one_combined_header(self):
|
||||
self.validate(['no-store, no-cache, must-revalidate'])
|
||||
|
||||
def test_rejects_missing_no_store(self):
|
||||
with self.assertRaises(AssertionError):
|
||||
self.validate(['no-cache'])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user