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
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()) assert HTTP_OK in r1 r2 = http('--session=' + session_path, 'GET', httpbin('/get'), env=self.env()) assert HTTP_OK in r2 assert r2.json['headers']['Foo'] == 'Bar'
def test_session_ignored_header_prefixes(self): 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 r1 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_unicode(self): UNICODE = u'太陽' r1 = http('--session=test', '--auth', u'test:' + UNICODE, 'GET', httpbin('/get'), u'Test:%s' % UNICODE, env=self.env()) assert HTTP_OK in r1 r2 = http('--session=test', 'GET', httpbin('/get'), env=self.env()) assert HTTP_OK in r2 assert (r2.json['headers']['Authorization'] == HTTPBasicAuth.make_header(u'test', UNICODE)) assert r2.json['headers']['Test'] == UNICODE
def test_5xx_check_status_exits_5(self): r = http('--check-status', 'GET', httpbin('/status/500'), error_exit_ok=True) assert 'HTTP/1.1 500' in r assert r.exit_status == ExitStatus.ERROR_HTTP_5XX
def test_query_string_params_in_url(self): r = http('--print=Hhb', 'GET', httpbin('/get?a=1&b=2')) path = '/get?a=1&b=2' url = httpbin(path) assert HTTP_OK in r assert 'GET %s HTTP/1.1' % path in r assert '"url": "%s"' % url in r
def test_4xx_check_status_exits_4(self): r = http('--check-status', 'GET', httpbin('/status/401'), error_exit_ok=True) assert 'HTTP/1.1 401' in r assert r.exit_status == ExitStatus.ERROR_HTTP_4XX # Also stderr should be empty since stdout isn't redirected. assert not r.stderr
def test_timeout_exit_status(self): r = http('--timeout=0.5', 'GET', httpbin('/delay/1'), error_exit_ok=True) assert HTTP_OK in r assert r.exit_status == ExitStatus.ERROR_TIMEOUT
def test_format_option(self): env = TestEnvironment(colors=256) r = http('--print=B', '--pretty=format', 'GET', httpbin('/get'), 'a=b', env=env) # Tests that the JSON data is formatted. assert r.strip().count('\n') == 2 assert COLOR not in r
def test_3xx_check_status_exits_3_and_stderr_when_stdout_redirected(self): env = TestEnvironment(stdout_isatty=False) r = http('--check-status', '--headers', 'GET', httpbin('/status/301'), env=env, error_exit_ok=True) assert 'HTTP/1.1 301' in r assert r.exit_status == ExitStatus.ERROR_HTTP_3XX assert '301 moved permanently' in r.stderr.lower()
def test_ignore_stdin_cannot_prompt_password(self): r = http('--ignore-stdin', '--auth=no-password', httpbin('/get'), error_exit_ok=True) assert r.exit_status == ExitStatus.ERROR assert 'because --ignore-stdin' in r.stderr
def test_ignore_stdin(self): with open(FILE_PATH) as f: env = TestEnvironment(stdin=f, stdin_isatty=False) r = http('--ignore-stdin', '--verbose', httpbin('/get'), env=env) assert HTTP_OK in r assert 'GET /get HTTP' in r, "Don't default to POST." assert FILE_CONTENT not in r, "Don't send stdin data."
def test_POST_explicit_JSON_auto_JSON_accept(self): r = http('--json', 'POST', httpbin('/post')) assert HTTP_OK in r assert r.json['headers']['Accept'] == 'application/json' # Make sure Content-Type gets set even with no data. # https://github.com/jkbr/httpie/issues/137 assert 'application/json' in r.json['headers']['Content-Type']
def test_GET_explicit_JSON_explicit_headers(self): r = http('--json', 'GET', httpbin('/headers'), 'Accept:application/xml', 'Content-Type:application/xml') assert HTTP_OK in r assert '"Accept": "application/xml"' in r assert '"Content-Type": "application/xml"' in r
def test_credentials_in_url(self): url = httpbin('/basic-auth/user/password') url = 'http://*****:*****@' + url.split('http://', 1)[1] r = http('GET', url) assert HTTP_OK in r assert '"authenticated": true' in r assert '"user": "******"' in r
def test_output_file_pretty_not_allowed_on_windows(self): env = TestEnvironment(is_windows=True) output_file = os.path.join( tempfile.gettempdir(), '__httpie_test_output__') r = http('--output', output_file, '--pretty=all', 'GET', httpbin('/get'), env=env) assert 'Only terminal output can be colorized on Windows' in r.stderr
def test_credentials_in_url_auth_flag_has_priority(self): """When credentials are passed in URL and via -a at the same time, then the ones from -a are used.""" r = http('--auth=user:password', 'GET', httpbin('/basic-auth/user/password', auth='user:wrong')) assert HTTP_OK in r assert r.json == {'authenticated': True, 'user': '******'}
def test_3xx_check_status_exits_3_and_stderr_when_stdout_redirected(self): env = TestEnvironment(stdout_isatty=False) r = http('--check-status', '--headers', 'GET', httpbin('/status/301'), env=env) assert 'HTTP/1.1 301' in r assert r.exit_status == ExitStatus.ERROR_HTTP_3XX assert '301 moved permanently' in r.stderr.lower()
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_query_string_params_in_url_and_items_with_duplicates(self): r = http('--print=Hhb', 'GET', httpbin('/get?a=1&a=1'), 'a==1', 'a==1', 'b==2') path = '/get?a=1&a=1&a=1&a=1&b=2' url = httpbin(path) assert HTTP_OK in r assert 'GET %s HTTP/1.1' % path in r assert '"url": "%s"' % url in r
def test_request_body_from_file_by_path_no_field_name_allowed(self): env = TestEnvironment(stdin_isatty=True) r = http('POST', httpbin('/post'), 'field-name@' + FILE_PATH_ARG, env=env, error_exit_ok=True) assert 'perhaps you meant --form?' in r.stderr
def test_encoded_stream(self): """Test that --stream works with non-prettified redirected terminal output.""" with open(BIN_FILE_PATH, 'rb') as f: env = TestEnvironment(stdin=f, stdin_isatty=False) r = http('--pretty=none', '--stream', '--verbose', 'GET', httpbin('/get'), env=env) assert BINARY_SUPPRESSED_NOTICE.decode() in r
def test_output_file_pretty_not_allowed_on_windows(self): env = TestEnvironment(is_windows=True) output_file = os.path.join( tempfile.gettempdir(), '__httpie_test_output__') r = http('--output', output_file, '--pretty=all', 'GET', httpbin('/get'), env=env, error_exit_ok=True) assert 'Only terminal output can be colorized on Windows' in r.stderr
def test_credentials_in_url_auth_flag_has_priority(self): """When credentials are passed in URL and via -a at the same time, then the ones from -a are used.""" url = httpbin('/basic-auth/user/password') url = 'http://*****:*****@' + url.split('http://', 1)[1] r = http('--auth=user:password', 'GET', url) assert HTTP_OK in r assert '"authenticated": true' in r assert '"user": "******"' in r
def test_actual_download(self): url = httpbin('/robots.txt') body = urlopen(url).read().decode() env = TestEnvironment(stdin_isatty=True, stdout_isatty=False) r = http('--download', url, env=env) assert 'Downloading' in r.stderr assert '[K' in r.stderr assert 'Done' in r.stderr assert body == r
def test_request_body_from_file_by_path_no_data_items_allowed(self): env = TestEnvironment(stdin_isatty=False) r = http('POST', httpbin('/post'), '@' + FILE_PATH_ARG, 'foo=bar', env=env, error_exit_ok=True) assert 'cannot be mixed' in r.stderr
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_subtype_based_pygments_lexer_match(self): """Test that media subtype is used if type/subtype doesn't match any lexer. """ env = TestEnvironment(colors=256) r = http('--print=B', '--pretty=all', httpbin('/post'), 'Content-Type:text/foo+json', 'a=b', env=env) assert COLOR in r
def test_binary_stdin(self): with open(BIN_FILE_PATH, 'rb') as stdin: env = TestEnvironment( stdin=stdin, stdin_isatty=False, stdout_isatty=False ) r = http('--print=B', 'POST', httpbin('/post'), env=env) assert r == BIN_FILE_CONTENT
def test_pretty_redirected_stream(self): """Test that --stream works with prettified redirected output.""" with open(BIN_FILE_PATH, 'rb') as f: env = TestEnvironment(colors=256, stdin=f, stdin_isatty=False, stdout_isatty=False) r = http('--verbose', '--pretty=all', '--stream', 'GET', httpbin('/get'), env=env) assert BINARY_SUPPRESSED_NOTICE.decode() in r
def test_3xx_check_status_redirects_allowed_exits_0(self): r = http('--check-status', '--follow', 'GET', httpbin('/status/301'), error_exit_ok=True) # The redirect will be followed so 200 is expected. assert 'HTTP/1.1 200 OK' in r assert r.exit_status == ExitStatus.OK
def test_upload_ok(self): r = http('--form', '--verbose', 'POST', httpbin('/post'), 'test-file@%s' % FILE_PATH_ARG, 'foo=bar') assert HTTP_OK in r assert 'Content-Disposition: form-data; name="foo"' in r assert 'Content-Disposition: form-data; name="test-file";' \ ' filename="%s"' % os.path.basename(FILE_PATH) in r assert r.count(FILE_CONTENT) == 2 assert '"foo": "bar"' in r
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_redirected_stream(self): """Test that --stream works with non-prettified redirected terminal output.""" with open(BIN_FILE_PATH, 'rb') as f: env = TestEnvironment(stdout_isatty=False, stdin_isatty=False, stdin=f) r = http('--pretty=none', '--stream', '--verbose', 'GET', httpbin('/get'), env=env) # We get 'Bad Request' but it's okay. #self.assertIn(OK.encode(), r) assert BIN_FILE_CONTENT in r
def test_windows_colorized_output(self): # Spits out the colorized output. http(httpbin('/get'), env=Environment())
def test_unicode_digest_auth(self): # it doesn't really authenticate us because httpbin # doesn't interpret the utf8-encoded auth http('--auth-type=digest', '--auth', u'test:%s' % UNICODE, httpbin(u'/digest-auth/auth/test/' + UNICODE))
def test_ok_response_exits_0(self): r = http('GET', httpbin('/status/200')) assert HTTP_OK in r assert r.exit_status == ExitStatus.OK
def test_error_response_exits_0_without_check_status(self): r = http('GET', httpbin('/status/500')) assert 'HTTP/1.1 500' in r assert r.exit_status == ExitStatus.OK assert not r.stderr