def test_startup_and_check_config_doc(idstorage, mongo):
    col = mongo.client[TEST_DB_NAME]['config']
    assert col.count() == 1  # only one config doc
    cfgdoc = col.find_one()
    assert cfgdoc['schema'] == 'schema'
    assert cfgdoc['schemaver'] == 1
    assert cfgdoc['inupdate'] is False

    # check startup works with cfg object in place
    idmap = IDMappingMongoStorage(mongo.client[TEST_DB_NAME])
    idmap.create_local_user(Username('foo'), HashedToken('t'))
    assert idmap.get_user(HashedToken('t')) == (Username('foo'), False)
def test_update_user_token_fail_input_None(idstorage):
    t = HashedToken('t')
    u = Username('u')
    fail_update_user_token(idstorage, None, t,
                           TypeError('username cannot be None'))
    fail_update_user_token(idstorage, u, None,
                           TypeError('token cannot be None'))
def check_local_get_user_admin(isadmin):
    storage = create_autospec(IDMappingStorage, spec_set=True, instance=True)
    storage.get_user.return_value = (Username('bar'), isadmin)

    assert LocalUserLookup(storage).get_user(Token('foo')) == \
        (User(AuthsourceID('local'), Username('bar')), isadmin, None, 300)

    thash = '2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae'
    assert storage.get_user.call_args_list == [((HashedToken(thash), ), {})]
def test_get_users(idstorage):
    assert idstorage.get_users() == {}

    idstorage.create_local_user(Username('foo'), HashedToken('t1'))

    assert idstorage.get_users() == {Username('foo'): False}

    idstorage.create_local_user(Username('mrsentity'), HashedToken('t2'))
    idstorage.create_local_user(Username('mrsenigma'), HashedToken('t3'))
    idstorage.update_local_user_token(Username('mrsenigma'), HashedToken('t4'))

    idstorage.set_local_user_as_admin(Username('foo'), True)
    idstorage.set_local_user_as_admin(Username('mrsenigma'), True)

    assert idstorage.get_users() == {
        Username('foo'): True,
        Username('mrsenigma'): True,
        Username('mrsentity'): False
    }
def test_set_user_as_admin(idstorage):
    idstorage.create_local_user(Username('foo'), HashedToken('bar'))

    assert idstorage.get_user(HashedToken('bar')) == (Username('foo'), False)

    # set twice to check 2nd is no-op
    idstorage.set_local_user_as_admin(Username('foo'), True)
    idstorage.set_local_user_as_admin(Username('foo'), True)

    assert idstorage.get_user(HashedToken('bar')) == (Username('foo'), True)

    idstorage.set_local_user_as_admin(Username('foo'), False)
    idstorage.set_local_user_as_admin(Username('foo'), False)

    assert idstorage.get_user(HashedToken('bar')) == (Username('foo'), False)

    idstorage.set_local_user_as_admin(Username('foo'), True)
    idstorage.set_local_user_as_admin(Username('foo'), None)

    assert idstorage.get_user(HashedToken('bar')) == (Username('foo'), False)
def test_hashed_token_hash():
    # string hashes will change from instance to instance of the python interpreter, and therefore
    # tests can't be written that directly test the hash value. See
    # https://docs.python.org/3/reference/datamodel.html#object.__hash__
    assert hash(HashedToken('foo')) == hash(HashedToken('foo'))
    assert hash(HashedToken('bar')) == hash(HashedToken('bar'))
    assert hash(HashedToken('foo')) != hash(HashedToken('bar'))
def test_create_update_and_get_user(idstorage):
    # create
    idstorage.create_local_user(Username('foo'), HashedToken('bar'))
    assert idstorage.get_user(HashedToken('bar')) == (Username('foo'), False)

    # update
    idstorage.update_local_user_token(Username('foo'), HashedToken('bat'))
    assert idstorage.get_user(HashedToken('bat')) == (Username('foo'), False)

    idstorage.update_local_user_token(Username('foo'), HashedToken('boo'))
    assert idstorage.get_user(HashedToken('boo')) == (Username('foo'), False)

    # test different user
    idstorage.create_local_user(Username('foo1'), HashedToken('baz'))
    assert idstorage.get_user(HashedToken('baz')) == (Username('foo1'), False)
def test_user_exists(idstorage):
    idstorage.create_local_user(Username('foo'), HashedToken('t1'))

    assert idstorage.user_exists(Username('foo')) is True
    assert idstorage.user_exists(Username('bar')) is False
def test_set_local_user_as_admin_fail_no_such_user(idstorage):
    idstorage.create_local_user(Username('bar'), HashedToken('whoo'))
    fail_set_local_user_as_admin(idstorage, Username('foo'),
                                 NoSuchUserError('foo'))
def test_get_user_fail_no_such_token(idstorage):
    idstorage.create_local_user(Username('u'), HashedToken('t'))
    fail_get_user(idstorage, HashedToken('t1'), InvalidTokenError())
def test_update_user_token_fail_no_such_user(idstorage):
    idstorage.create_local_user(Username('u'), HashedToken('t'))
    fail_update_user_token(idstorage, Username('u1'), HashedToken('t1'),
                           NoSuchUserError('u1'))
def test_update_user_token_fail_duplicate_token(idstorage):
    idstorage.create_local_user(Username('u'), HashedToken('t'))
    idstorage.create_local_user(Username('u1'), HashedToken('t1'))
    fail_update_user_token(
        idstorage, Username('u1'), HashedToken('t'),
        ValueError('The provided token already exists in the database'))
def test_create_user_fail_duplicate_user(idstorage):
    idstorage.create_local_user(Username('u'), HashedToken('t'))
    fail_create_user(idstorage, Username('u'), HashedToken('t1'),
                     UserExistsError('u'))
def test_hashed_token_init_pass():
    ht = HashedToken('foo')
    assert ht.token_hash == 'foo'
def test_hashed_token_equals():
    assert HashedToken('foo') == HashedToken('foo')
    assert HashedToken('foo') != HashedToken('bar')
    assert HashedToken('foo') != 'foo'
def fail_hashed_token_init(htoken: str, expected: Exception):
    with raises(Exception) as got:
        HashedToken(htoken)
    assert_exception_correct(got.value, expected)