コード例 #1
0
ファイル: test_db.py プロジェクト: dgw/sopel
def test_unalias_nick(db: SopelDB):
    nick = 'Embolalia'
    nick_id = 42

    with db.session() as session:
        nn = Nicknames(
            nick_id=nick_id,
            slug=Identifier(nick).lower(),
            canonical=nick,
        )
        session.add(nn)
        session.commit()

    aliases = ['EmbölaliÅ', 'Embo`work', 'Embo']
    with db.session() as session:
        for alias in aliases:
            nn = Nicknames(
                nick_id=nick_id,
                slug=Identifier(alias).lower(),
                canonical=alias,
            )
            session.add(nn)
            session.commit()

    for alias in aliases:
        db.unalias_nick(alias)

    with db.session() as session:
        found = session.scalar(
            select(func.count()).select_from(Nicknames).where(
                Nicknames.nick_id == nick_id))
        assert found == 1
コード例 #2
0
ファイル: test_db.py プロジェクト: dgw/sopel
def test_get_nick_id_migration(db: SopelDB):
    """Test nicks with wrong casemapping are properly migrated."""
    nick = 'Test[User]'
    old_nick = Identifier._lower_swapped(nick)

    # sanity check
    assert Identifier(nick).lower() != old_nick, (
        'Previous casemapping should be different from the new one')

    # insert old version
    with db.session() as session:
        nickname = Nicknames(
            nick_id=42,
            slug=Identifier._lower_swapped(nick),
            canonical=nick,
        )
        session.add(nickname)
        session.commit()

    assert db.get_nick_id(nick) == 42, 'Old nick must be converted.'

    with db.session() as session:
        nicknames = session.execute(select(Nicknames)).scalars().fetchall()
        assert len(nicknames) == 1, (
            'There should be only one instance of Nicknames.')
        nickname_found = nicknames[0]
        assert nickname_found.nick_id == 42
        assert nickname_found.slug == Identifier(nick).lower()
        assert nickname_found.canonical == nick
コード例 #3
0
ファイル: test_db.py プロジェクト: dgw/sopel
def test_get_nick_id_casemapping(db: SopelDB, name, slug, variant):
    """Test get_nick_id is case-insensitive through an Identifier."""
    nick = Identifier(name)

    # Create the nick ID
    nick_id = db.get_nick_id(nick, create=True)

    with db.session() as session:
        registered = session.execute(
            select(Nicknames).where(
                Nicknames.canonical == name)).scalars().fetchall()

    assert len(registered) == 1
    assert registered[0].slug == slug
    assert registered[0].canonical == name

    # Check that the retrieval actually is idempotent
    assert nick_id == db.get_nick_id(name)

    # Even if the case is different
    assert nick_id == db.get_nick_id(variant)

    # And no other nick IDs are created (even with create=True)
    assert nick_id == db.get_nick_id(name, create=True)
    assert nick_id == db.get_nick_id(variant, create=True)

    with db.session() as session:
        assert 1 == session.scalar(select(func.count()).select_from(NickIDs))

    # But a truly different name means a new nick ID
    new_nick_id = db.get_nick_id(name + '_test', create=True)
    assert new_nick_id != nick_id

    with db.session() as session:
        assert 2 == session.scalar(select(func.count()).select_from(NickIDs))
コード例 #4
0
ファイル: test_db.py プロジェクト: dgw/sopel
def test_set_plugin_value(db: SopelDB):
    # set new value
    db.set_plugin_value('plugname', 'qwer', 'zxcv')
    with db.session() as session:
        result = session.query(PluginValues.value) \
                        .filter(PluginValues.plugin == 'plugname') \
                        .filter(PluginValues.key == 'qwer') \
                        .scalar()
        assert result == '"zxcv"'

    # update pre-existing value
    db.set_plugin_value('plugname', 'qwer', 'new_zxcv')

    with db.session() as session:
        result = session.query(PluginValues.value) \
                        .filter(PluginValues.plugin == 'plugname') \
                        .filter(PluginValues.key == 'qwer') \
                        .scalar()
        assert result == '"new_zxcv"'
コード例 #5
0
ファイル: test_db.py プロジェクト: dgw/sopel
def test_set_channel_value(db: SopelDB):
    # set new value
    db.set_channel_value('#channel', 'testkey', 'channel-value')

    with db.session() as session:
        result = session.query(ChannelValues.value) \
                        .filter(ChannelValues.channel == '#channel') \
                        .filter(ChannelValues.key == 'testkey') \
                        .scalar()
        assert result == '"channel-value"'

    # update pre-existing value
    db.set_channel_value('#channel', 'testkey', 'new_channel-value')

    with db.session() as session:
        result = session.query(ChannelValues.value) \
                        .filter(ChannelValues.channel == '#channel') \
                        .filter(ChannelValues.key == 'testkey') \
                        .scalar()
        assert result == '"new_channel-value"'
コード例 #6
0
ファイル: test_db.py プロジェクト: dgw/sopel
def test_get_channel_value(db: SopelDB):
    with db.session() as session:
        channel_value = ChannelValues(
            channel='#channel',
            key='testkey',
            value='\"value\"',
        )
        session.add(channel_value)
        session.commit()

    result = db.get_channel_value('#channel', 'testkey')
    assert result == 'value'
コード例 #7
0
ファイル: test_db.py プロジェクト: dgw/sopel
def test_get_nick_value(db: SopelDB, value):
    nick = 'TerryGilliam'
    nick_id = db.get_nick_id(nick, create=True)

    with db.session() as session:
        nick_value = NickValues(
            nick_id=nick_id,
            key='testkey',
            value=json.dumps(value, ensure_ascii=False),
        )
        session.add(nick_value)
        session.commit()

    assert db.get_nick_value(nick, 'testkey') == value
    assert db.get_nick_value(nick, 'otherkey') is None
    assert db.get_nick_value('NotTestUser', 'testkey') is None, (
        'This key must be defined for TerryGilliam only.')
コード例 #8
0
ファイル: test_db.py プロジェクト: dgw/sopel
def test_get_nick_id(db: SopelDB):
    """Test get_nick_id does not create NickID by default."""
    nick = Identifier('MrEricPraline')

    # Attempt to get nick ID: it is not created by default
    with pytest.raises(ValueError):
        db.get_nick_id(nick)

    # Create the nick ID
    nick_id = db.get_nick_id(nick, create=True)

    # Check that one and only one nickname exists with that ID
    with db.session() as session:
        nickname = session.execute(
            select(Nicknames).where(Nicknames.nick_id == nick_id)).scalar_one(
            )  # will raise if not one and exactly one
    assert nickname.canonical == 'MrEricPraline'
    assert nickname.slug == nick.lower()
コード例 #9
0
ファイル: test_db.py プロジェクト: dgw/sopel
def test_get_channel_slug_with_migration(db: SopelDB):
    channel = db.make_identifier('#[channel]')
    db.set_channel_value(channel, 'testkey', 'cval')
    assert db.get_channel_slug(channel) == channel.lower()
    assert db.get_channel_value(channel, 'testkey') == 'cval'

    # insert a value with the wrong casemapping
    old_channel = Identifier._lower_swapped('#[channel]')
    assert old_channel == '#[channel]'
    assert channel.lower() == '#{channel}'

    with db.session() as session:
        channel_value = ChannelValues(
            channel=old_channel,
            key='oldkey',
            value='"value"'  # result from json.dumps
        )
        session.add(channel_value)
        session.commit()

    assert db.get_channel_slug(old_channel) == channel.lower(), (
        'Channel with previous casemapping must return the new version.')
    assert db.get_channel_value(old_channel, 'oldkey') == 'value', (
        'Key associated to an old version must be migrated to the new one')