import json from pathlib import Path from typing import Generator, Iterable import pytest from specklepy.api.wrapper import StreamWrapper from specklepy.paths import accounts_path def test_parse_stream(): wrap = StreamWrapper("https://testing.speckle.dev/streams/a75ab4f10f") assert wrap.type == "stream" def test_parse_branch(): wacky_wrap = StreamWrapper( "https://testing.speckle.dev/streams/4c3ce1459c/branches/%F0%9F%8D%95%E2%AC%85%F0%9F%8C%9F%20you%20wat%3F" ) wrap = StreamWrapper( "https://testing.speckle.dev/streams/4c3ce1459c/branches/next%20level" ) assert wacky_wrap.type == "branch" assert wacky_wrap.branch_name == "🍕⬅🌟 you wat?" assert wrap.type == "branch" def test_parse_nested_branch(): wrap = StreamWrapper( "https://testing.speckle.dev/streams/4c3ce1459c/branches/izzy/dev" ) assert wrap.branch_name == "izzy/dev" assert wrap.type == "branch" def test_parse_commit(): wrap = StreamWrapper( "https://testing.speckle.dev/streams/4c3ce1459c/commits/8b9b831792" ) assert wrap.type == "commit" def test_parse_object(): wrap = StreamWrapper( "https://testing.speckle.dev/streams/a75ab4f10f/objects/5530363e6d51c904903dafc3ea1d2ec6" ) assert wrap.type == "object" def test_parse_globals_as_branch(): wrap = StreamWrapper("https://testing.speckle.dev/streams/0c6ad366c4/globals/") assert wrap.type == "branch" def test_parse_globals_as_commit(): wrap = StreamWrapper( "https://testing.speckle.dev/streams/0c6ad366c4/globals/abd3787893" ) assert wrap.type == "commit" #! NOTE: the following three tests may not pass locally # if you have a `speckle.xyz` account in manager def test_get_client_without_auth(): wrap = StreamWrapper("https://speckle.xyz/streams/4c3ce1459c/commits/8b9b831792") client = wrap.get_client() assert client is not None def test_get_new_client_with_token(): wrap = StreamWrapper("https://speckle.xyz/streams/4c3ce1459c/commits/8b9b831792") client = wrap.get_client() client = wrap.get_client(token="super-secret-token") assert client.account.token == "super-secret-token" def test_get_transport_with_token(): wrap = StreamWrapper("https://speckle.xyz/streams/4c3ce1459c/commits/8b9b831792") client = wrap.get_client() assert not client.account.token # unauthenticated bc no local accounts transport = wrap.get_transport(token="super-secret-token") assert transport is not None assert client.account.token == "super-secret-token" @pytest.fixture def user_path() -> Iterable[Path]: path = accounts_path().joinpath("test_acc.json") # hey, py37 doesn't support the missing_ok argument try: path.unlink() except Exception: pass try: path.unlink(missing_ok=True) except Exception: pass path.parent.absolute().mkdir(exist_ok=True) yield path path.unlink() def test_wrapper_url_match(user_path) -> None: """ The stream wrapper should only recognize exact url matches for the account definitions and not match for subdomains. """ account = { "token": "foobar", "serverInfo": {"name": "foo", "url": "http://foo.bar.baz", "company": "Foo"}, "userInfo": {"id": "bla", "name": "A rando tester", "email": "rando@tester.me"}, } user_path.write_text(json.dumps(account)) wrap = StreamWrapper("http://bar.baz/streams/bogus") account = wrap.get_account() assert account.userInfo.email is None