From 1d987c5b4d76f9e18de725ae1fd4c08ae8ee7768 Mon Sep 17 00:00:00 2001 From: Jakub Roztocil Date: Fri, 25 Apr 2014 13:50:44 +0200 Subject: [PATCH] Improved session tests. --- tests/test_sessions.py | 162 ++++++++++++++++++++++++----------------- 1 file changed, 94 insertions(+), 68 deletions(-) diff --git a/tests/test_sessions.py b/tests/test_sessions.py index 9c778b25..70f7e4fb 100644 --- a/tests/test_sessions.py +++ b/tests/test_sessions.py @@ -4,95 +4,121 @@ import shutil from tests import TestEnvironment, mk_config_dir, http, httpbin, HTTP_OK -class TestSessions: - - @property - def env(self): - return TestEnvironment(config_dir=self.config_dir) +class BaseSessionTest(object): def setup_method(self, method): - # Start a full-blown session with a custom request header, - # authorization, and response cookies. + """Create and a unique config dir for each test.""" self.config_dir = mk_config_dir() - r = http('--follow', '--session=test', '--auth=username:password', - 'GET', httpbin('/cookies/set?hello=world'), 'Hello:World', - env=self.env) - assert HTTP_OK in r def teardown_method(self, method): shutil.rmtree(self.config_dir) - def test_session_create(self): - # Verify that the session has been created. - r = http('--session=test', 'GET', httpbin('/get'), env=self.env) - assert HTTP_OK in r - assert r.json['headers']['Hello'] == 'World' - assert r.json['headers']['Cookie'] == 'hello=world' - assert 'Basic ' in r.json['headers']['Authorization'] + def env(self): + """ + Return an environment. + + Each environment created withing a test method + will share the same config_dir. It is necessary + for session files being reused. + + """ + return TestEnvironment(config_dir=self.config_dir) + + +class TestSessionFlow(BaseSessionTest): + """ + These tests, start with an existing session create in setup_method(). + + """ + + def setup_method(self, method): + """ + Start a full-blown session with a custom request header, + authorization, and response cookies. + + """ + super(TestSessionFlow, self).setup_method(method) + r1 = http('--follow', '--session=test', '--auth=username:password', + 'GET', httpbin('/cookies/set?hello=world'), 'Hello:World', + env=self.env()) + assert HTTP_OK in r1 + + def test_session_created_and_reused(self): + # Verify that the session created in setup_method() has been used. + r2 = http('--session=test', 'GET', httpbin('/get'), env=self.env()) + assert HTTP_OK in r2 + assert r2.json['headers']['Hello'] == 'World' + assert r2.json['headers']['Cookie'] == 'hello=world' + assert 'Basic ' in r2.json['headers']['Authorization'] + + def test_session_update(self): + # Get a response to a request from the original session. + r2 = http('--session=test', 'GET', httpbin('/get'), env=self.env()) + assert HTTP_OK in r2 + + # Make a request modifying the session data. + r3 = http('--follow', '--session=test', '--auth=username:password2', + 'GET', httpbin('/cookies/set?hello=world2'), 'Hello:World2', + env=self.env()) + assert HTTP_OK in r3 + + # Get a response to a request from the updated session. + r4 = http('--session=test', 'GET', httpbin('/get'), env=self.env()) + assert HTTP_OK in r4 + assert r4.json['headers']['Hello'] == 'World2' + assert r4.json['headers']['Cookie'] == 'hello=world2' + assert (r2.json['headers']['Authorization'] != + r4.json['headers']['Authorization']) + + def test_session_read_only(self): + # Get a response from the original session. + r2 = http('--session=test', 'GET', httpbin('/get'), env=self.env()) + assert HTTP_OK in r2 + + # Make a request modifying the session data but + # with --session-read-only. + r3 = http('--follow', '--session-read-only=test', + '--auth=username:password2', 'GET', + httpbin('/cookies/set?hello=world2'), 'Hello:World2', + env=self.env()) + assert HTTP_OK in r3 + + # Get a response from the updated session. + r4 = http('--session=test', 'GET', httpbin('/get'), env=self.env()) + assert HTTP_OK in r4 + + # Origin can differ on Travis. + del r2.json['origin'], r4.json['origin'] + # Different for each request. + del r2.json['headers']['X-Request-Id'] + del r4.json['headers']['X-Request-Id'] + + # Should be the same as before r3. + assert r2.json == r4.json + + +class TestSession(BaseSessionTest): + """Stand-alone session tests.""" def test_session_ignored_header_prefixes(self): - r = http('--session=test', 'GET', httpbin('/get'), + r1 = http('--session=test', 'GET', httpbin('/get'), 'Content-Type: text/plain', 'If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT', - env=self.env) - assert HTTP_OK in r + env=self.env()) + assert HTTP_OK in r1 - r2 = http('--session=test', 'GET', httpbin('/get')) + r2 = http('--session=test', 'GET', httpbin('/get'), env=self.env()) assert HTTP_OK in r2 assert 'Content-Type' not in r2.json['headers'] assert 'If-Unmodified-Since' not in r2.json['headers'] - def test_session_update(self): - # Get a response to a request from the original session. - r1 = http('--session=test', 'GET', httpbin('/get'), env=self.env) - assert HTTP_OK in r1 - - # Make a request modifying the session data. - r2 = http('--follow', '--session=test', '--auth=username:password2', - 'GET', httpbin('/cookies/set?hello=world2'), 'Hello:World2', - env=self.env) - assert HTTP_OK in r2 - - # Get a response to a request from the updated session. - r3 = http('--session=test', 'GET', httpbin('/get'), env=self.env) - assert HTTP_OK in r3 - assert r3.json['headers']['Hello'] == 'World2' - assert r3.json['headers']['Cookie'] == 'hello=world2' - assert (r1.json['headers']['Authorization'] != - r3.json['headers']['Authorization']) - - def test_session_read_only(self): - # Get a response from the original session. - r1 = http('--session=test', 'GET', httpbin('/get'), env=self.env) - assert HTTP_OK in r1 - - # Make a request modifying the session data but - # with --session-read-only. - r2 = http('--follow', '--session-read-only=test', - '--auth=username:password2', 'GET', - httpbin('/cookies/set?hello=world2'), 'Hello:World2', - env=self.env) - assert HTTP_OK in r2 - - # Get a response from the updated session. - r3 = http('--session=test', 'GET', httpbin('/get'), env=self.env) - assert HTTP_OK in r3 - - # Origin can differ on Travis. - del r1.json['origin'], r3.json['origin'] - # Different for each request. - del r1.json['headers']['X-Request-Id'], \ - r3.json['headers']['X-Request-Id'] - # Should be the same as before r2. - assert r1.json == r3.json - def test_session_by_path(self): session_path = os.path.join(self.config_dir, 'session-by-path.json') r1 = http('--session=' + session_path, 'GET', httpbin('/get'), - 'Foo:Bar', env=self.env) + 'Foo:Bar', env=self.env()) assert HTTP_OK in r1 r2 = http('--session=' + session_path, 'GET', httpbin('/get'), - env=self.env) + env=self.env()) assert HTTP_OK in r2 assert r2.json['headers']['Foo'] == 'Bar'