def test_worker_factory(): class Service(object): foo_proxy = rpc_proxy("foo_service") bar_proxy = rpc_proxy("bar_service") class OtherService(object): pass # simplest case, no overrides instance = worker_factory(Service) assert isinstance(instance, Service) assert isinstance(instance.foo_proxy, Mock) assert isinstance(instance.bar_proxy, Mock) # no injections to replace instance = worker_factory(OtherService) assert isinstance(instance, OtherService) # override specific injection bar_injection = object() instance = worker_factory(Service, bar_proxy=bar_injection) assert isinstance(instance, Service) assert isinstance(instance.foo_proxy, Mock) assert instance.bar_proxy is bar_injection # non-applicable injection with pytest.raises(DependencyNotFound): worker_factory(Service, nonexist=object())
def test_worker_factory(): class Service(object): foo_proxy = rpc_proxy("foo_service") bar_proxy = rpc_proxy("bar_service") class OtherService(object): pass # simplest case, no overrides instance = worker_factory(Service) assert isinstance(instance, Service) assert isinstance(instance.foo_proxy, Mock) assert isinstance(instance.bar_proxy, Mock) # no injections to replace instance = worker_factory(OtherService) assert isinstance(instance, OtherService) # override specific injection bar_injection = object() instance = worker_factory(Service, bar_proxy=bar_injection) assert isinstance(instance, Service) assert isinstance(instance.foo_proxy, Mock) assert instance.bar_proxy is bar_injection # non-applicable injection instance = worker_factory(Service, nonexist=object()) assert isinstance(instance, Service) assert isinstance(instance.foo_proxy, Mock) assert isinstance(instance.bar_proxy, Mock) assert not hasattr(instance, "nonexist")
def test_worker_factory(): class Service(object): name = "service" foo_proxy = RpcProxy("foo_service") bar_proxy = RpcProxy("bar_service") class OtherService(object): pass # simplest case, no overrides instance = worker_factory(Service) assert isinstance(instance, Service) assert isinstance(instance.foo_proxy, Mock) assert isinstance(instance.bar_proxy, Mock) # no dependencies to replace instance = worker_factory(OtherService) assert isinstance(instance, OtherService) # override specific dependency bar_dependency = object() instance = worker_factory(Service, bar_proxy=bar_dependency) assert isinstance(instance, Service) assert isinstance(instance.foo_proxy, Mock) assert instance.bar_proxy is bar_dependency # non-applicable dependency with pytest.raises(ExtensionNotFound): worker_factory(Service, nonexist=object())
def test_receive_new_publication(entrypoint_waiter_mock, entrypoint_hook_mock): service4 = worker_factory(Service4) consumer = worker_factory(ConsumerService) payload = '776223' with entrypoint_hook_mock(service4, 'dispatch_publication') as dispatch: with entrypoint_waiter_mock(consumer, 'receive_new_publication'): dispatch(payload)
def test_get_history(): service4 = worker_factory(Service4) # Mock redis attribute to storage publications mlist = sample(range(100000, 999999), 100) setattr(service4._redis, 'published_numbers', mlist) # Mock redis llen method def llen_mock(key): mlist = getattr(service4._redis, key) return len(mlist) service4._redis.llen.side_effect = llen_mock # Mock redis lrange method to get published publications def lrange_mock(key, start, end): mlist = getattr(service4._redis, key) if end == -1: return mlist[start:] return mlist[start:end] service4._redis.lrange.side_effect = lrange_mock history = service4._redis.lrange('published_numbers', 0, -1) mlistlen = service4._redis.llen('published_numbers') assert mlistlen == len(history) assert isinstance(history, list)
def test_get_approvals_and_call_changes_detector(*args): service = worker_factory(SyncerApprovalsLoaderService) service.load_page(page_number=1) (service.syncer_changes_detector_service.detect_changes. call_async.called_once_with(APPROVAL_FXT["AffiliateOffer"]))
def test_search_entity(database): service = worker_factory(ReferentialService, database=database) database.entities.insert_one({ 'id': '0', 'common_name': 'The Hangover', 'provider': 'provider', 'type': 'movie', 'informations': { 'starring': 'Bradley Cooper' }, 'internationalization': [{ 'language': 'fr', 'translation': 'la gueule de bois' }], 'allowed_users': ['admin'] }) database.entities.create_index([('common_name', TEXT)], default_language='english') res = bson.json_util.loads( service.search_entity('hangover', 'admin', 'movie', 'provider')) assert len(res) == 1 assert res[0]['common_name'] == 'The Hangover' res = bson.json_util.loads( service.search_entity('unknown', 'admin', 'movie', 'provider')) assert len(res) == 0 res = bson.json_util.loads(service.search_entity('hangover', 'admin')) assert len(res) == 1 assert res[0]['common_name'] == 'The Hangover'
def test_get_entity_picture(database): service = worker_factory(ReferentialService, database=database) database.entities.insert_one({ 'id': '0', 'common_name': 'The Hangover', 'provider': 'me', 'type': 'movie', 'informations': { 'starring': 'Bradley Cooper' }, 'allowed_users': ['admin'] }) database.entities.create_index('id') database.subscriptions.insert_one({ 'user': '******', 'subscription': { 'pictures': ['mycontext'] } }) pic = 'iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA5QCQAEZ726+FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wwDFggcPIpPMAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAG7UlEQVRo3q1ayY7cRBj+vnK5p7snvc2W6QyQAAHCASQunBBInHgEbtw4cOfOiQMSb8AbcOMduHNEAilCJGICEZNJZuket+vnYLddLle57Q6WLC/1u+rftzJ/++YDgQAiBgAgIgAku4qU70SQA1rjqLyXHH59v35PEiBBECAAEKRC9pi/o8rggAyWRD6aPyvr2/p8CtscwvLWN5xfCRQI1WHFmipH2Hesiat8XV81SAjbEsXAK+ZIkA4MvVRLLsk6rtJqUR1k+ibkcwCuNcwDxK6SJhuQpoMd2xHSjL94ibIR6kZEjpgE8G5xqHaLuNKmM+ysTuusIUUP49lRret2o7vIIUymZIqkLCLpmYYW4eworQ0Gup3Xoket1xbuGndFOj7jdxxEjW1sZcE6AzQBKTDntvOpuCZBCACle2AUe5koUhItAGBSSLIs4xII2kBdXCUB3RwJxE9/hbI8RiQLHHz6FUbvf5Yh2cAaKI3rP3/B6U/fQpKFH8EC2KdaXbyWbOZKyTwBJMXu2x+hP3+3lXZGwylU/D3MammhJQHjcsfq71RzVAt7chbBLjuV3oEeH7c2s3h8BBX3y3RkfQZNg43+QLlw3EY4AkS39hENbnVwGAp6fFSN5uB2gbSUiFRThSZHmHOwSNyYaX88mYNRr9PiO0dvFjkAc29GdomG27hfVwXsZwh6szuAiroRMn+QeUylnPk2Ga2EAmJz0KN1J4E14tkJ6CVEIOkqc8vOMTh+UKgWrbn9tLAx/1JtpWFLoXpm6qYnx15CxBiszk+90/aOXgfXdYijsmgtHZuQbazLnkJFiKdzgB6+pAkWf/3qGHWuDpM51GC02Z3Q1Zh6faNCFs68iguean0PRDtDRLszP+9MiuSfhxCT+qWyfzevIhvWqmSgJcJ0CZFGdYJ19WS1BKLBGNFgEiBkheXTh5DVIuC57gNinDUC6zbEFAUfDOuGxRol5an6Y0T9kZ+QZInV2SOYZOkn5PgdiDFOhok6typjsrlCZENkZCgYDiZQ/bEXUXN9jvTyXyensgi5fR+ElI2HbQqykpC2WWcgbxqMofr+qJ6cnyJdXMDcXPlTlf17oI6DfrdtYNC10lQCEqRnLFfD6Na+N04AQHL2GFgtIMvLQPI4RjTcgywvnDx/gyYwWOrSH3dsm7FaO6UKK+jRYZBnq2ePIKsbmJtrP0+jHnqzk6wHVimViQazrFGiWGnZ2IGoqfAuYag04umdICHJ2WOISWCWF4HcUUPvnVSyBxufwsnQvaJyr0GC6zpbidNds5sLkl+sewLUMfR0HpbI8yeAMTDXz/z1RhShN3sVlxBQ0dPhy1pO3syElQrRrqEZrmsqKmXxbx3VA0d6fgpIiuT53xBjamkMVQQ9O6lKnx26hfmYDro9aeiJleU8VBQjGh0F15l98iUgBr3bbwVcLKFHh2C8k3Hes0YjIVJIpGUrlJ7ch4AaTKB6w+A0kw8/3+y+d2eI+iOYxYt6WyVIXRVOk2rL6EGIGMSTOV72UP0sxZHlRSMHpQjXvhSlycXR5wpZUef44O5LExINp4iG0+bMhKxnTtaptykry06aQe/wjf9BIiOo4bTqWkM4BMZ0lxxHpB6L4oN7jd9c//4zIAaqP8LOyXvecphRDL27B5+at7T1LI5s3fUnEe+9FoQ3N5d48uPXeU51F/MvfoDa2fVzdDLPiBTTqaHNQiINrbFGLoiA/RGiWwdhQq5fAOkKjHTmkYwJ97lmr0CpGJLebKWehUQYzBbruShz+9AN8QMA0quzwlDN8hIwSRiR6RyIIqsNTb+73bw/0uASfGWhCHob7MO8eJq3ehQkuYYJ1CQZISd5Bt2muKqfjrHTSXQkUBUQAoHeeyXbwfVwmlEP6cXTovkmxiC9eoZodOjhMKEGY6idQR5L2nrRch7+8d3HspVSioC9IVSvH9yvNMkCcnNVSFD1R8G6BQDS6/Oasbe3kYZeqwR3THIXliyQJosNbj9v1OR2wgbGutYa2lDw4aRJBNWHgWcGYXyUyGY3Sv8jvU0qCbhfKmdvqt6IELcx4eZcDTU2wVrwkpYxQsI+s05IVliV/dcM2ke1rQOswNCRAKWZ8XUl8LtYX4ORAXvU3pDNzbuojTBdGjLcEMNbFlm6lEJ1W5BS3U5f/+GwzrUETqmw3mahtfXnc+AOvN04oecDcXjm7peWuZYq/zigU7/UqlxrnHY4lTK80rqvtMs8CSd8YwzM51MES9V0c51uMYfV+4rR2j0D+rlP1qvX8vuqaMVCyf3/oJZIlTW7+1Yc7KX8ryrP4ynrpp6lB5Ij5EpTPK2wikeTGraU0tK9PC7WYKFrut65YL1uduXaBNulA9K2c4NN/QPgP5X8M4FGzNM3AAAAAElFTkSuQmCC' fs = gridfs.GridFS(database) filename = hashlib.sha1(''.join(['bitmap', '0', 'mycontext', 'myformat']).encode('utf-8')).hexdigest() with tempfile.TemporaryFile() as f: f.write(binascii.hexlify(base64.b64decode(pic))) f.flush() f.seek(0) fs.put(f, filename=filename) entity_pic = service.get_entity_picture('0', 'mycontext', 'myformat', 'admin') assert entity_pic == pic
def test_get_events_by_name(database): service = worker_factory(ReferentialService, database=database) database.events.create_index([('common_name', TEXT)], default_language='english') database.events.insert_one({ 'id': '0', 'date': datetime.datetime.now(), 'provider': 'provider', 'type': 'type', 'common_name': 'Name', 'content': 'New Movie', 'entities': [{ 'common_name': 'Bradley', 'id': 'b1' }], 'allowed_users': ['admin'] }) res = bson.json_util.loads(service.get_events_by_name('name', 'admin')) assert len(res) == 1 assert res[0]['id'] == '0'
def test_get_events_between_dates(database): service = worker_factory(ReferentialService, database=database) database.events.insert_one({ 'id': '0', 'date': datetime.datetime(2018, 5, 7, 14, 30), 'provider': 'provider', 'type': 'type', 'common_name': 'Name', 'content': 'New Movie', 'entities': [{ 'common_name': 'Bradley', 'id': 'b1' }], 'allowed_users': ['admin'] }) events = bson.json_util.loads( service.get_events_between_dates('2018-05-07', '2018-05-15', 'admin')) assert len(events) == 1 assert events[0]['id'] == '0' events = bson.json_util.loads( service.get_events_between_dates('2018-05-05', '2018-05-07', 'admin')) assert len(events) == 0
def test_update_all_ru1(database): service = worker_factory(OptaCollectorService, database=database) service.opta.get_rugby_calendar.side_effect = lambda season_id, competition_id: [{ 'competition_id': competition_id, 'season_id': season_id, 'date': datetime.datetime.now(), 'home_id': 'h_id', 'away_id': 'a_id', 'id': 'g_id', 'fingerprint': 'calendar' }] service.database.ru1.insert_one({ 'competition_id': 'c_id', 'season_id': 's_id', 'date': datetime.datetime.now(), 'home_id': 'h_id', 'away_id': 'a_id', 'id': 'g_id', 'fingerprint': 'calendar'}) service.update_all_f1() assert service.database.ru1.find_one({'id': 'g_id'})['season_id'] == 's_id' assert service.database.ru1.find_one({'id': 'g_id'})['competition_id'] == 'c_id'
def test_unack_ru7(database): service = worker_factory(OptaCollectorService, database=database) service.database.ru7.insert_one({'id': 'g_id', 'checksum': 'toto'}) service.unack_ru7('g_id') assert service.database.ru7.find_one({'id': 'g_id'}) is None
def test_set_log_level(): service = worker_factory(MyService) logger = logging.getLogger("foo.bar") logger.setLevel(logging.ERROR) service.set_log_level("foo.bar", logging.DEBUG) logger = logging.getLogger("foo.bar") assert logger.level == logging.DEBUG
def test_dispatches_event_if_was_none(*args): service = worker_factory(SyncerChangesDetectorService) approval = {"id": 1, "approval_status": "approved"} service.detect_changes(approval) service.dispatch.called_once_with(approval)
def test_does_not_dispatch_event_as_already_approved(*args): service = worker_factory(SyncerChangesDetectorService) approval = {"id": 1, "approval_status": "approved"} service.detect_changes(approval) assert not service.dispatch.called
def test_send_email(self): service = worker_factory(EmailSender) payload = { 'client': { 'name': 'John', 'email': '*****@*****.**' }, 'payee': { 'name': 'Ben', 'email': '*****@*****.**' }, 'payment': { 'amount': 198, 'currency': "GBP" } } fake_request = MagicMock() fake_request.status_code = 200 with patch('email_sender_service.EmailSender.create_email') as create_email: with patch('requests.post') as fake_post: create_email.return_value = 'EMAIL TESTING' fake_post.return_value = fake_request assert service.send_email(payload) == 200
def test_parse_service(self, add_posts_into_db): service = worker_factory(Service) result = service.parse() self.assertTrue(add_posts_into_db.called) self.assertEqual(result, {'added': 10})
def test_match_storage(session): service = worker_factory(MatchService, rep=session) # check player start matches (after fixture) assert len(service.get_player_matches(USER("A"))) == 1 assert len(service.get_player_matches(USER("B"))) == 1 assert len(service.get_player_matches(USER("C"))) == 0 # save new match assert service.end_match(USER("A"), USER("C"), SCORE_LOW, SCORE_HIGH) # check new match is added assert len(service.get_player_matches(USER("A"))) == 2 assert len(service.get_player_matches(USER("B"))) == 1 assert len(service.get_player_matches(USER("C"))) == 1 # check if 2 wins against 1, then result is 2 assert service.end_match(USER("D"), USER("E"), SCORE_LOW, SCORE_HIGH) assert service.get_player_matches(USER("D"))[0]["result"] == 2 # check if 1 wins against 2, then result is 1 assert service.end_match(USER("F"), USER("G"), SCORE_HIGH, SCORE_LOW) assert service.get_player_matches(USER("F"))[0]["result"] == 1 # check if draw, then result is 0 assert service.end_match(USER("H"), USER("I"), SCORE_HIGH, SCORE_HIGH) assert service.get_player_matches(USER("H"))[0]["result"] == 0 # check all matches have been added assert len(service.get_all_matches()) == 5
def test_get_index() -> None: """Tests the index page.""" service = worker_factory(CapabilitiesService) result = service.send_index(MOCKED_API_SPEC) assert result == { 'status': 'success', 'code': 200, 'data': { 'api_version': '1.0.0-rc.2', 'backend_version': '1.0.0', 'title': 'EODC API', 'description': 'The EODC API provides access to the EODC services and data, as well as access to the openEO' ' endpoints.', 'endpoints': [{ 'path': '/', 'methods': ['GET'] }], 'stac_version': '0.6.2', 'id': 'eodc-openeo-backend', 'production': True, 'links': [] } }
def test_match_progress(session): service = worker_factory(MatchService, rep=session) # check codes are different in different conditions start_time = time.time() code_a = service.generate_match_code(USER("A"), USER("B"), start_time) code_b = service.generate_match_code(USER("A"), USER("C"), start_time) code_c = service.generate_match_code(USER("B"), USER("C"), start_time) assert code_a != code_b assert code_a != code_c assert code_b != code_c time.sleep(0.1) code_d = service.generate_match_code(USER("A"), USER("B"), time.time()) assert code_a != code_d # simulate guess code = service.generate_match_code(USER("A"), USER("B"), time.time()) flags_names, flags_urls = service.get_flags(code) assert service.guess_flag(code, "Wrong Country") is None for i in range(20): flag_url = service.guess_flag(code, flags_names[i]) assert flag_url == flags_urls[i]
def tests_get_count_and_call_approvals_loader_service(*args): service = worker_factory(SyncerService) service.run() assert (service.syncer_approvals_loader_service.load_page.call_async. call_count) == 1
def test_create_email(self): service = worker_factory(EmailSender) payload = { 'client': { 'name': 'John', 'email': '*****@*****.**' }, 'payee': { 'name': 'Ben' }, 'payment': { 'amount': 198, 'currency': "GBP" } } expected_email = "Dear Ben,\n\n\ You have received a payment of 198 GBP from John ([email protected]).\n\ \n\ Yours,\n\ student.com\n" actual_email = service.create_email(payload) assert actual_email == expected_email
def test_get_file_formats() -> None: """Tests the description of available file formats.""" service = worker_factory(CapabilitiesService) result = service.get_file_formats(MOCKED_API_SPEC) assert result == { 'status': 'success', 'code': 200, 'data': { 'output': { 'GTiff': { 'title': 'GeoTiff', 'gis_data_types': ['raster'], 'parameters': {} }, 'png': { 'title': 'PNG', 'gis_data_types': ['raster'], 'parameters': {} }, 'jpeg': { 'title': 'JPEG', 'gis_data_types': ['raster'], 'parameters': {} } }, 'input': { 'GTiff': { 'title': 'GeoTiff', 'gis_data_types': ['raster'], 'parameters': {} } } } }
def test_fetch_scale_config(self): fake_provider = mock.MagicMock(DockerClient) fake_provider.containers.run.return_value.logs.return_value = b'{}' service = worker_factory(ScalerDocker, docker=fake_provider) # type: ScalerDocker service.fetch_image_config('nginx') fake_provider.containers.run.assert_called_once_with('nginx', 'scale_info', remove=False, detach=True)
def test_get_udfs() -> None: """Tests the description of available UDF runtime.""" service = worker_factory(CapabilitiesService) result = service.get_udfs(MOCKED_API_SPEC) assert result == { 'status': 'success', 'code': 200, 'data': [{ 'default': '3.6', 'name': 'Python', 'versions': { '3.6': { 'libraries': { 'numpy': { 'links': { 'href': 'https://docs.scipy.org/doc/', 'rel': 'about' }, 'version': '1.18.1' } } } } }] }
def test_get_transformation(database): service = worker_factory(MetadataService, database=database) result = bson.json_util.loads(service.get_transformation('0')) assert not result database.transformations.insert_one({ 'depends_on': None, 'id': '0', 'materialized': False, 'function_name': 'my_function', 'function': 'CREATE FUNCTION my_function (data DOUBLE) RETURN TABLE (result DOUBLE) LANGUAGE PYTHON{}', 'target_table': None, 'function_only': True, 'trigger_tables': None, 'type': 'transform', 'input': None, 'creation_date': datetime.datetime.utcnow(), 'process_date': None }) result = bson.json_util.loads(service.get_transformation('0')) assert result['id'] == '0'
def test_handle_event_calls_requests_post_with_correct_data(mock_requests_post): mockresponse = Mock() mock_requests_post.return_value = mockresponse service = worker_factory(SendsMail) mock_payload = { 'client': { 'name': 'mock_name', 'email': 'mock_email' }, 'payee': { 'name': 'mock_name', 'email': 'mock_email' }, 'payment': { 'amount': 'mock_amount', 'currency': 'mock_currency' } } service.handle_event(mock_payload) requests.post.assert_called_once_with( DOMAIN, auth = ('api', API_KEY), data = { "from": EMAIL, "to": EMAIL, "subject": "Payment received", "text": (""" Dear mock_name, You have received a payment of mock_amount mock_currency from mock_name (mock_email). Yours, Student.com """)})
def test_greet_with_mockcache(): fake_cache = mockcache.Client() hello_svc = worker_factory(HelloWorld, cache=fake_cache) assert hello_svc.greet("Matt") == "Hello Matt!" assert fake_cache.get("Matt") == "Hello Matt!"
def test_mail_service_unit(self): mail_service = worker_factory(MailService) payload = self._get_payload() assert mail_service.on_payment_received(payload) del payload['payee'] assert mail_service.on_payment_received(payload) == False
def scores_service_with_players(): players = [ mock.MagicMock(name='player2', score=10), mock.MagicMock(name='player1', score=20)] service = worker_factory(ScoreService) service.player_rpc.get_players.side_effect = lambda: players service.player_rpc.get_player.side_effect = lambda p: players[p - 1] return service
def test_greet(): hello_svc = worker_factory(HelloWorld) hello_svc.cache.get.return_value = None assert hello_svc.greet("Matt") == "Hello Matt!" assert hello_svc.cache.get.call_args_list == [call("Matt")]
def test_service(session): # create instance, providing the test database session service = worker_factory(Service, db=session) # verify ``save`` logic by querying the test database service.save("helloworld") assert session.query(Result.value).all() == [("helloworld",)]
def http_ep(): sample_settings = { 'serverip': '0.0.0.0', 'notify': False, 'sendpic': True } service = worker_factory(HttpEntrypointService) service.storage_rpc.get_all = mock.Mock(return_value=sample_settings) return service
def test_create_pokemon(): service = worker_factory(PokemonService) service.create_pokemon(1, 'Bulbasaur') assert service.session.add.call_count == 1 created_pokemon = service.session.add.call_args[0][0] assert created_pokemon.user_id == 1 assert created_pokemon.pokemon_name == 'Bulbasaur'
def test_conversion_service(): # create worker with mock dependencies service = worker_factory(ConversionService) # add side effects to the mock proxy to the "maths" service service.maths_rpc.multiply.side_effect = lambda x, y: x * y service.maths_rpc.divide.side_effect = lambda x, y: x / y # test inches_to_cm business logic assert service.inches_to_cm(300) == 762 service.maths_rpc.multiply.assert_called_once_with(300, 2.54) # test cms_to_inches business logic assert service.cms_to_inches(762) == 300 service.maths_rpc.divide.assert_called_once_with(762, 2.54)
def test_conversion_service(): # create instance # dependencies are replaced with mocks unless otherwise given - see # :class:`nameko.testing.services.worker_factory` service = worker_factory(ConversionService) # replace "math" service service.math.multiply.side_effect = lambda x, y: x * y service.math.divide.side_effect = lambda x, y: x / y # test inches_to_cm business logic assert service.inches_to_cm(300) == 762 service.math.multiply.assert_called_once_with(300, 2.54) # test cms_to_inches business logic assert service.cms_to_inches(762) == 300 service.math.divide.assert_called_once_with(762, 2.54)
def service(session): return worker_factory(PokemonService, session=session)
def test_will_send_valid_payload(self): test_service = worker_factory(Mailer) assert test_service.handle_event(self.valid_payload())["success"]
def test_will_not_send_invalid_payload(self): test_service = worker_factory(Mailer) results = test_service.handle_event(self.invalid_payload()) assert results["success"] == False assert len(results["errors"]) == 1 assert results["errors"][0] == "Invalid Payload"
def test_empty_leaderboard(): service = worker_factory(ScoreService) assert service.leaderboard() == []
def service(session): return worker_factory(PlayersService, session=session)
def test_case(): assemble_svc = worker_factory(AssembleService) ped_content = '#familyID\tsampleID\n15052\t15052-1-1A\n' assemble_svc.case('cust003', '15052', 'exomes', ped_content) expected_file = ANALYSIS_ROOT.joinpath("cust003/15052/exomes/15052/" "15052_pedigree.txt")