from disco.state import State, StateConfig
from disco.gateway.events import VoiceStateUpdate
from disco.util.emitter import Emitter


class MockClient(object):
    def __init__(self):
        self.events = Emitter()


def get_state(config=None):
    return State(MockClient(), config or StateConfig())


def test_state_remove_expired_voice_states_device_change():
    state = get_state()

    event = VoiceStateUpdate.create({
        'session_id': 'a',
        'guild_id': 1,
        'channel_id': 1,
        'user_id': 1,
    }, None)
    state.client.events.emit('VoiceStateUpdate', event)

    assert len(state.voice_states) == 1
    assert 'a' in state.voice_states

    event = VoiceStateUpdate.create({
        'session_id': 'b',
        'guild_id': 1,
        'channel_id': 1,
        'user_id': 1,
    }, None)
    state.client.events.emit('VoiceStateUpdate', event)

    assert len(state.voice_states) == 1
    assert 'a' not in state.voice_states
    assert 'b' in state.voice_states