- Errors are now wrapped in a
TestingBot::Errorhierarchy. Methods previously leaked rawRestClientexceptions (RestClient::Unauthorized,RestClient::NotFound, …) and raised a bareStringfor in-body API errors. They now raiseTestingBot::AuthenticationError,TestingBot::NotFoundError,TestingBot::RateLimitError,TestingBot::ClientError,TestingBot::ServerError,TestingBot::ApiError,TestingBot::ParseErrororTestingBot::ConnectionError(all subclasses ofTestingBot::Error, carrying#http_statusand#body). Update anyrescue RestClient::...clauses accordingly. - The gem module is now consistently
TestingBot(was split betweenTestingBotandTestingbot).TestingBot::VERSIONholds the gem version.
get_authentication_hashno longer raisesNameError—digestis now required.~/.testingbotcredentials are split on the first:only, so secrets containing a colon are no longer truncated.- Path segments (IDs, session IDs, …) are URL-encoded;
upload_remote_fileandcreate_user_in_teamno longer post to trailing-slash paths. upload_local_fileno longer leaks a file descriptor and shares the versioned URL and error handling with the other requests.update_*/delete_*/stop_testreturn a real boolean instead ofnilwhen the response omits asuccesskey.
- Configurable open/read timeouts on every request (defaults 10s / 30s).
- Automatic retries with exponential backoff + jitter for idempotent requests on
transient failures (timeouts, 5xx) and 429 (honoring
Retry-After). POSTs are not auto-retried. - Non-JSON and empty response bodies are handled gracefully.
- Debug output redacts secret-bearing fields.
get_jobget_tunnel, and a no-argumentdelete_tunnelget_device, server-side filtering onget_devices,get_ip_rangesget_user_keys,get_user_client_key- optional filters on
get_tests - Full Codeless Lab tests surface (
get_lab_tests,create_lab_test,get_lab_test,update_lab_test,delete_lab_test, steps, browsers, alert, report, schedule, trigger, stop,trigger_all_lab_tests) - Full Codeless Lab suites surface (
get_lab_suites,create_lab_suite,get_lab_suite,delete_lab_suite, tests, browsers, trigger) update_local_file/update_remote_file(replace a stored app binary)
- Transport extracted into
TestingBot::Connection(a singlerequestmethod, dependency-injectable for testing) behind the unchangedTestingBot::Apisurface. - New offline, mocked unit suite (WebMock) under
spec/unit; the live suite underspec/integrationis tagged:integrationand runs only with credentials.rake unitis the default and CI gate;rake integrationruns the live suite. bin/testingbotvalidates input, reads the secret without echoing it, and writes the credentials file with0600permissions.