def test_entity_version():
    # Test the ability to get specific versions of Synapse Entities
    
    #Create a new project
    project = create_project()

    entity = create_data_entity(project['id'])
    syn.setAnnotations(entity, {'fizzbuzz':111222})

    #Get new entity and check that it is same
    entity = syn.getEntity(entity)
    assert entity.versionNumber == 1

    entity.description = 'Changed something'
    entity.foo = 998877
    entity = syn.updateEntity(entity, incrementVersion=True)
    assert entity.versionNumber == 2

    annotations = syn.getAnnotations(entity, version=1)
    assert annotations['fizzbuzz'][0] == 111222

    returnEntity = syn.getEntity(entity, version=1)
    assert returnEntity.versionNumber == 1
    assert returnEntity['fizzbuzz'][0] == 111222
    assert 'foo' not in returnEntity

    returnEntity = syn.getEntity(entity)
    assert returnEntity.versionNumber == 2
    assert returnEntity['description'] == 'Changed something'
    assert returnEntity['foo'][0] == 998877

    returnEntity = syn.get(entity, version=1)
    assert returnEntity.versionNumber == 1
    assert returnEntity['fizzbuzz'][0] == 111222
    assert 'foo' not in returnEntity
def test_annotations():
    ## create a new project
    project = create_project()

    entity = create_data_entity(project['id'])

    a = syn.getAnnotations(entity)
    assert 'etag' in a

    print a

    a['bogosity'] = 'total'
    print a
    syn.setAnnotations(entity, a)

    a2 = syn.getAnnotations(entity)
    assert a2['bogosity'] == ['total']

    a2['primes'] = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
    a2['phat_numbers'] = [1234.5678, 8888.3333, 1212.3434, 6677.8899]
    a2['goobers'] = ['chris', 'jen', 'jane']
    a2['present_time'] = datetime.now()

    syn.setAnnotations(entity, a2)
    a3 = syn.getAnnotations(entity)
    assert a3['primes'] == [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
    assert a3['phat_numbers'] == [1234.5678, 8888.3333, 1212.3434, 6677.8899]
    assert a3['goobers'] == ['chris', 'jen', 'jane']
    ## only accurate to within a second 'cause synapse strips off the fractional part
    assert a3['present_time'][0].strftime('%Y-%m-%d %H:%M:%S') == a2[
        'present_time'].strftime('%Y-%m-%d %H:%M:%S')
def test_annotations():
    ## create a new project
    project = create_project()

    entity = create_data_entity(project['id'])

    a = syn.getAnnotations(entity)
    assert 'etag' in a

    print a

    a['bogosity'] = 'total'
    print a
    syn.setAnnotations(entity, a)

    a2 = syn.getAnnotations(entity)
    assert a2['bogosity'] == ['total']

    a2['primes'] = [2,3,5,7,11,13,17,19,23,29]
    a2['phat_numbers'] = [1234.5678, 8888.3333, 1212.3434, 6677.8899]
    a2['goobers'] = ['chris', 'jen', 'jane']
    a2['present_time'] = datetime.now()

    syn.setAnnotations(entity, a2)
    a3 = syn.getAnnotations(entity)
    assert a3['primes'] == [2,3,5,7,11,13,17,19,23,29]
    assert a3['phat_numbers'] == [1234.5678, 8888.3333, 1212.3434, 6677.8899]
    assert a3['goobers'] == ['chris', 'jen', 'jane']
    ## only accurate to within a second 'cause synapse strips off the fractional part
    assert a3['present_time'][0].strftime('%Y-%m-%d %H:%M:%S') == a2['present_time'].strftime('%Y-%m-%d %H:%M:%S')
def test_entity_version():
    # Test the ability to get specific versions of Synapse Entities

    #Create a new project
    project = create_project()

    entity = create_data_entity(project['id'])
    syn.setAnnotations(entity, {'fizzbuzz': 111222})

    #Get new entity and check that it is same
    entity = syn.getEntity(entity)
    assert entity.versionNumber == 1

    entity.description = 'Changed something'
    entity.foo = 998877
    entity = syn.updateEntity(entity, incrementVersion=True)
    assert entity.versionNumber == 2

    annotations = syn.getAnnotations(entity, version=1)
    assert annotations['fizzbuzz'][0] == 111222

    returnEntity = syn.getEntity(entity, version=1)
    assert returnEntity.versionNumber == 1
    assert returnEntity['fizzbuzz'][0] == 111222
    assert 'foo' not in returnEntity

    returnEntity = syn.getEntity(entity)
    assert returnEntity.versionNumber == 2
    assert returnEntity['description'] == 'Changed something'
    assert returnEntity['foo'][0] == 998877

    returnEntity = syn.get(entity, version=1)
    assert returnEntity.versionNumber == 1
    assert returnEntity['fizzbuzz'][0] == 111222
    assert 'foo' not in returnEntity
def test_query():
    #Create a project then add entities and verify that I can find them with a query
    project = create_project()
    for i in range(2):
        try:
            entity = create_data_entity(project['id'])
        except Exception as ex:
            print ex
            print ex.response.text
        qry= syn.query("select id, name from entity where entity.parentId=='%s'" % project['id'])
        assert qry['totalNumberOfResults']==(i+1)
def test_keyword_annotations():
    """
    Test setting annotations using keyword arguments
    """
    ## create a new project and data entity
    project = create_project()
    entity = create_data_entity(project['id'])

    annos = syn.setAnnotations(entity, wazoo='Frank', label='Barking Pumpkin', shark=16776960)
    assert annos['wazoo'] == ['Frank']
    assert annos['label'] == ['Barking Pumpkin']
    assert annos['shark'] == [16776960]
def test_updateEntity_version():
    project = create_project()
    entity = create_data_entity(project['id'])
    entity['name'] = 'foobarbat'
    entity['description'] = 'This is a test entity...'
    entity = syn.updateEntity(entity, incrementVersion=True, versionLabel="Prada remix")
    returnEntity = syn.getEntity(entity)
    
    # syn.printEntity(returnEntity)
    assert returnEntity['name'] == 'foobarbat'
    assert returnEntity['description'] == 'This is a test entity...'
    assert returnEntity['versionNumber'] == 2
    assert returnEntity['versionLabel'] == 'Prada remix'
def test_query():
    #Create a project then add entities and verify that I can find them with a query
    project = create_project()
    for i in range(2):
        try:
            entity = create_data_entity(project['id'])
        except Exception as ex:
            print ex
            print ex.response.text
        qry = syn.query(
            "select id, name from entity where entity.parentId=='%s'" %
            project['id'])
        assert qry['totalNumberOfResults'] == (i + 1)
def test_updateEntity_version():
    project = create_project()
    entity = create_data_entity(project['id'])
    entity['name'] = 'foobarbat'
    entity['description'] = 'This is a test entity...'
    entity = syn.updateEntity(entity,
                              incrementVersion=True,
                              versionLabel="Prada remix")
    returnEntity = syn.getEntity(entity)

    # syn.printEntity(returnEntity)
    assert returnEntity['name'] == 'foobarbat'
    assert returnEntity['description'] == 'This is a test entity...'
    assert returnEntity['versionNumber'] == 2
    assert returnEntity['versionLabel'] == 'Prada remix'
def test_keyword_annotations():
    """
    Test setting annotations using keyword arguments
    """
    ## create a new project and data entity
    project = create_project()
    entity = create_data_entity(project['id'])

    annos = syn.setAnnotations(entity,
                               wazoo='Frank',
                               label='Barking Pumpkin',
                               shark=16776960)
    assert annos['wazoo'] == ['Frank']
    assert annos['label'] == ['Barking Pumpkin']
    assert annos['shark'] == [16776960]
def test_uploadFile():
    project = create_project()

    ## here, entity has been saved to Synapse and entity is an Entity object
    entity = create_data_entity(project['id'])

    #create a temporary file
    fname = utils.make_bogus_data_file()
    syn.uploadFile(entity, fname)

    #Download and verify that it is the same filename
    entity = syn.downloadEntity(entity)
    assert entity['files'][0]==os.path.basename(fname)
    assert filecmp.cmp(fname, os.path.join(entity['cacheDir'],entity['files'][0]))
    os.remove(fname)
def test_uploadFile():
    project = create_project()

    ## here, entity has been saved to Synapse and entity is an Entity object
    entity = create_data_entity(project['id'])

    #create a temporary file
    fname = utils.make_bogus_data_file()
    syn.uploadFile(entity, fname)

    #Download and verify that it is the same filename
    entity = syn.downloadEntity(entity)
    assert entity['files'][0] == os.path.basename(fname)
    assert filecmp.cmp(fname,
                       os.path.join(entity['cacheDir'], entity['files'][0]))
    os.remove(fname)
def test_chunked_query():
    # Change the size of the query limit
    oldLimit = client.QUERY_LIMIT
    client.QUERY_LIMIT = 3
    
    # Create a project to dump a bunch of Entities into
    project = create_project()
    for i in range(client.QUERY_LIMIT * 5):
        try:
            entity = create_data_entity(project['id'])
        except Exception as ex:
            print ex
            print ex.response.text
            
    iter = syn.chunkedQuery("select * from entity where entity.parentId=='%s'" % project['id'])
    count = 0
    for res in iter:
        count += 1
    assert count == (client.QUERY_LIMIT * 5)
    
    # Restore the size of the query limit
    client.QUERY_LIMIT = oldLimit
def test_chunked_query():
    # Change the size of the query limit
    oldLimit = client.QUERY_LIMIT
    client.QUERY_LIMIT = 3

    # Create a project to dump a bunch of Entities into
    project = create_project()
    for i in range(client.QUERY_LIMIT * 5):
        try:
            entity = create_data_entity(project['id'])
        except Exception as ex:
            print ex
            print ex.response.text

    iter = syn.chunkedQuery(
        "select * from entity where entity.parentId=='%s'" % project['id'])
    count = 0
    for res in iter:
        count += 1
    assert count == (client.QUERY_LIMIT * 5)

    # Restore the size of the query limit
    client.QUERY_LIMIT = oldLimit
def test_provenance():
    """
    test provenance features
    """

    ## create a new project
    project = create_project()

    ## create a data entity
    try:
        filename = utils.make_bogus_data_file()

        data_entity = create_data_entity(project['id'])

        data_entity = syn.uploadFile(data_entity, filename)
    finally:
        os.remove(filename)

    ## create a code entity, source of the data above
    code = """
    ## Chris's fabulous random data generator
    ############################################################
    import random
    random.seed(12345)
    data = [random.gauss(mu=0.0, sigma=1.0) for i in range(100)]
    """
    try:
        try:
            f = tempfile.NamedTemporaryFile(suffix=".py", delete=False)
            f.write(code)
            f.write("\n")
        finally:
            f.close()
        CODE_JSON['parentId'] = project['id']
        code_entity = syn.createEntity(CODE_JSON)
        code_entity = syn.uploadFile(code_entity, f.name)
    finally:
        os.remove(f.name)

    ## create a new activity asserting that the code entity was used to
    ## make the data entity
    activity = Activity(name='random.gauss',
                        description='Generate some random numbers')
    activity.used(code_entity, wasExecuted=True)
    activity.used(
        {
            'name': 'Superhack',
            'url': 'https://github.com/joe_coder/Superhack'
        },
        wasExecuted=True)

    activity = syn.setProvenance(data_entity, activity)
    ## retrieve the saved provenance record
    retrieved_activity = syn.getProvenance(data_entity)

    ## does it match what we expect?
    assert retrieved_activity == activity

    ## test update
    new_description = 'Generate random numbers like a gangsta'
    retrieved_activity['description'] = new_description
    updated_activity = syn.updateActivity(retrieved_activity)

    ## did the update stick?
    assert updated_activity['name'] == retrieved_activity['name']
    assert updated_activity['description'] == new_description

    ## test delete
    syn.deleteProvenance(data_entity)

    try:
        ## provenance should be gone now
        ## decided this should throw exception with a 404
        deleted_activity = syn.getProvenance(data_entity['id'])
    except Exception as ex:
        assert ex.response.status_code == 404
    else:
        assert False, 'Should throw 404 exception'
def test_download_empty_entity():
    project = create_project()
    entity = create_data_entity(project['id'])
    entity = syn.downloadEntity(entity)
def test_download_empty_entity():
    project = create_project()
    entity = create_data_entity(project['id'])
    entity = syn.downloadEntity(entity)
def test_provenance():
    """
    test provenance features
    """

    ## create a new project
    project = create_project()

    ## create a data entity
    try:
        filename = utils.make_bogus_data_file()

        data_entity = create_data_entity(project['id'])

        data_entity = syn.uploadFile(data_entity, filename)
    finally:
        os.remove(filename)

    ## create a code entity, source of the data above
    code = """
    ## Chris's fabulous random data generator
    ############################################################
    import random
    random.seed(12345)
    data = [random.gauss(mu=0.0, sigma=1.0) for i in range(100)]
    """
    try:
        try:
            f = tempfile.NamedTemporaryFile(suffix=".py", delete=False)
            f.write(code)
            f.write("\n")
        finally:
            f.close()
        CODE_JSON['parentId']= project['id']
        code_entity = syn.createEntity(CODE_JSON)
        code_entity = syn.uploadFile(code_entity, f.name)
    finally:
        os.remove(f.name)

    ## create a new activity asserting that the code entity was used to
    ## make the data entity
    activity = Activity(name='random.gauss', description='Generate some random numbers')
    activity.used(code_entity, wasExecuted=True)
    activity.used({'name':'Superhack', 'url':'https://github.com/joe_coder/Superhack'}, wasExecuted=True)

    activity = syn.setProvenance(data_entity, activity)
    ## retrieve the saved provenance record
    retrieved_activity = syn.getProvenance(data_entity)

    ## does it match what we expect?
    assert retrieved_activity == activity

    ## test update
    new_description = 'Generate random numbers like a gangsta'
    retrieved_activity['description'] = new_description
    updated_activity = syn.updateActivity(retrieved_activity)

    ## did the update stick?
    assert updated_activity['name'] == retrieved_activity['name']
    assert updated_activity['description'] == new_description

    ## test delete
    syn.deleteProvenance(data_entity)

    try:
        ## provenance should be gone now
        ## decided this should throw exception with a 404
        deleted_activity = syn.getProvenance(data_entity['id'])
    except Exception as ex:
        assert ex.response.status_code == 404
    else:
        assert False, 'Should throw 404 exception'