Beispiel #1
0
 def test_setup(self):
     parser = LinotParser()
     self.service.setup(parser)
Beispiel #2
0
 def setUp(self):
     parser = LinotParser(usage=argparse.SUPPRESS, add_help=False)
     self.parser = parser
Beispiel #3
0
 def setUp(self):
     self.service = Service()
     self.service._twitch = MockTwitchEngine()
     self.parser = LinotParser(usage=argparse.SUPPRESS, add_help=False)
     interfaces.get('test').reset()
Beispiel #4
0
class TestService:
    def setUp(self):
        self.service = Service()
        self.service._twitch = MockTwitchEngine()
        self.parser = LinotParser(usage=argparse.SUPPRESS, add_help=False)
        interfaces.get('test').reset()

    def tearDown(self):
        try:
            os.remove(self.service.SUB_FILE)
        except OSError:
            pass

    def test_init(self):
        # some basic tests
        ok_(self.service.is_start() is False)
        ok_(self.service.CMD == 'twitch')

    def test_setup_argument(self):
        def set_matching_0(val, sender):
            set_matching_0.ret = (len(val) == 0)

        def set_matching_1(val, sender):
            set_matching_1.ret = (set(val) == set(['test1']))

        def set_matching_2(val, sender):
            set_matching_2.ret = (set(val) == set(['test1', 'test2']))

        def ret_val(val, sender):
            ret_val.ret = val

        def direct_cmd_set_match(match, cmd, sender):
            direct_cmd_set_match.ret = (set(match) == set(['kaydada']))

        # test argument and function relation
        test_list = [
            # -subscribe +
            ['-subscribe test1', '_subscribe', set_matching_1],
            ['-subscribe test1 test2', '_subscribe', set_matching_2],
            # -unsubscribe +
            ['-unsubscribe test1', '_unsubscribe', set_matching_1],
            ['-unsubscribe test1 test2', '_unsubscribe', set_matching_2],
            # -unsuball
            ['-unsuball', '_unsub_all', ret_val],
            ['-unsuball abc', '_unsub_all', ret_val],
            # -import
            ['-import test1', '_import', set_matching_1],
            # -listchannel
            ['-listchannel', '_list_channel', ret_val],
            ['-listchannel abc', '_list_channel', ret_val],
            # -refresh
            ['-refresh', '_refresh', ret_val],
            ['-refresh abc', '_refresh', ret_val],
            # -listusers *
            ['-listusers', '_list_users', set_matching_0],
            ['-listusers test1', '_list_users', set_matching_1],
            ['-listusers test1 test2', '_list_users', set_matching_2],
        ]

        for test in test_list:
            self.setUp()
            method_bak = None
            for name, method in inspect.getmembers(self.service, predicate=inspect.ismethod):
                if name == test[1]:
                    method_bak = method
                    setattr(self.service, name, test[2])
            ok_(method_bak is not None, test[0] + ' case method not found')
            self.service.setup(self.parser)  # setup calls _setup_arguments
            cmd = self.service.CMD + ' ' + test[0]
            args, unknowns = self.parser.parse_known_args(cmd.split())
            test[2].ret = False
            args.proc(args, None)
            ok_(test[2].ret, 'failed: '+test[0])

        # test direct command
        test_list = [
            # direct command: sub by url
            ['www.twitch.tv/kaydada', '_sub_by_url', direct_cmd_set_match],
        ]

        for test in test_list:
            self.setUp()
            method_bak = None
            for name, method in inspect.getmembers(self.service, predicate=inspect.ismethod):
                if name == test[1]:
                    method_bak = method
                    setattr(self.service, name, test[2])
            ok_(method_bak is not None, test[0] + ' case method not found')
            self.service.setup(self.parser)  # setup calls _setup_arguments
            cmd = test[0]
            self.parser.process_direct_commands(cmd, None)
            ok_(test[2].ret, 'failed: '+test[0])

    def test_start_subfile_exists(self):
        fake_sublist = {
            'testid1': ['testch1', 'testch2', 'testch3'],
            'testid2': ['testch2'],
            'testid3': ['testch1', 'testch3'],
            'testid4': ['testch2'],
        }
        pickle.dump(fake_sublist, open(self.service.SUB_FILE, 'wb+'))
        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()
        ok_(self.service._channel_sub_count['testch1'] == 2, 'count =' + str(self.service._channel_sub_count['testch1']))
        ok_(self.service._channel_sub_count['testch2'] == 3, 'count =' + str(self.service._channel_sub_count['testch2']))
        ok_(self.service._channel_sub_count['testch3'] == 2, 'count =' + str(self.service._channel_sub_count['testch3']))
        ok_(self.service._channel_sub_count['testch4'] == 0, 'count =' + str(self.service._channel_sub_count['testch4']))

    def test_start_subfile_not_found(self):
        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()
        ok_(set(self.service._sublist['testid1']) == set([]))
        ok_(set(self.service._sublist['testid2']) == set([]))
        ok_(self.service._channel_sub_count['testch1'] == 0, 'count =' + str(self.service._channel_sub_count['testch1']))
        ok_(self.service._channel_sub_count['testch2'] == 0, 'count =' + str(self.service._channel_sub_count['testch2']))

    def test_get_sublist(self):
        fake_sublist = {
            'testid1': ['testch1', 'testch2', 'testch3'],
            'testid2': ['testch2'],
            'testid3': ['testch1', 'testch3'],
        }
        pickle.dump(fake_sublist, open(self.service.SUB_FILE, 'wb+'))
        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()
        sublist = self.service.get_sublist()
        ok_(len(fake_sublist.viewkeys() ^ sublist.viewkeys()) == 0)
        for key in fake_sublist:
            ok_(set(fake_sublist[key]) == set(sublist[key]))

    def test_calculate_channel_count(self):
        self.service._sublist = {
            'testid1': ['testch1', 'testch2', 'testch3'],
            'testid2': ['testch2'],
            'testid3': ['testch1', 'testch3', 'testch2'],
        }
        self.service._calculate_channel_sub_count()
        ok_(self.service._channel_sub_count['testch1'] == 2)
        ok_(self.service._channel_sub_count['testch2'] == 3)
        ok_(self.service._channel_sub_count['testch3'] == 2)
        ok_(self.service._channel_sub_count['testch4'] == 0)
        self.service._sublist = defaultdict(list)
        self.service._calculate_channel_sub_count()
        ok_(self.service._channel_sub_count['testch1'] == 0)
        ok_(self.service._channel_sub_count['testch2'] == 0)
        ok_(self.service._channel_sub_count['testch3'] == 0)
        ok_(self.service._channel_sub_count['testch4'] == 0)

    def test_subscribe_one(self):
        try:
            os.remove(self.service.SUB_FILE)
        except OSError:
            pass

        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()

        self.service._twitch.set_exists_channel_list(['testch1', 'testch2'])
        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._subscribe(['testch1'], fake_sender)

        ok_('testch1' in [x.lower() for x in self.service._sublist[fake_sender]],
            'sublist = '+str(self.service._sublist[fake_sender]))
        ok_('not found' not in ' '.join(interfaces.get('test').msg_queue[fake_sender]))
        ok_(self.service._channel_sub_count['testch1'] == 1)

        fake_sender2 = CommandSubmitter('test', 'fake_sender2')
        self.service._subscribe(['testch1'], fake_sender2)

        ok_(self.service._channel_sub_count['testch1'] == 2)

    def test_subscribe_one_exists(self):
        try:
            os.remove(self.service.SUB_FILE)
        except OSError:
            pass
        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()

        self.service._twitch.set_exists_channel_list(['testch1', 'testch2'])
        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._sublist[fake_sender] = ['testch1']
        self.service._subscribe(['testch1'], fake_sender)

        ok_(self.service._sublist[fake_sender].count('testch1') == 1,
            'sublist = '+str(self.service._sublist[fake_sender]))
        ok_('not found' not in ' '.join(interfaces.get('test').msg_queue[fake_sender]))

    def test_subscribe_one_not_found(self):
        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()

        self.service._twitch.set_exists_channel_list(['testch2', 'testch3'])
        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._subscribe(['testch1'], fake_sender)

        ok_('testch1' not in self.service._sublist[fake_sender],
            'sublist = '+str(self.service._sublist[fake_sender]))
        ok_('not found' in ' '.join(interfaces.get('test').msg_queue[fake_sender]))

    def test_subscribe_multi(self):
        try:
            os.remove(self.service.SUB_FILE)
        except OSError:
            pass
        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()

        self.service._twitch.set_exists_channel_list(['testch1', 'testch2'])
        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._subscribe(['testch1', 'testch2'], fake_sender)
        ok_('testch1' in self.service._sublist[fake_sender],
            'sublist = '+str(self.service._sublist[fake_sender]))
        ok_('testch2' in self.service._sublist[fake_sender],
            'sublist = '+str(self.service._sublist[fake_sender]))
        ok_('not found' not in ' '.join(interfaces.get('test').msg_queue[fake_sender]))

    def test_unsubscribe_one(self):
        self.test_subscribe_one()

        fake_sender = CommandSubmitter('test', 'fake_sender')
        fake_sender2 = CommandSubmitter('test', 'fake_sender2')
        self.service._subscribe(['testch2'], fake_sender)
        self.service._unsubscribe(['testch1'], fake_sender)

        ok_('testch1' not in self.service._sublist[fake_sender],
            'sublist = '+str(self.service._sublist[fake_sender]))
        ok_('not found' not in ' '.join(interfaces.get('test').msg_queue[fake_sender]))
        ok_(self.service._channel_sub_count['testch1'] == 1)

        self.service._unsubscribe(['testch1'], fake_sender2)

        ok_('testch1' not in self.service._sublist[fake_sender2],
            'sublist = '+str(self.service._sublist[fake_sender2]))
        ok_(self.service._channel_sub_count['testch1'] == 0)

    def test_unsubscribe_one_not_found(self):
        self.test_subscribe_one()

        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._subscribe(['testch2'], fake_sender)
        self.service._unsubscribe(['testch3'], fake_sender)

        ok_('testch1' in self.service._sublist[fake_sender],
            'sublist = '+str(self.service._sublist[fake_sender]))
        ok_('testch2' in self.service._sublist[fake_sender],
            'sublist = '+str(self.service._sublist[fake_sender]))
        ok_('not found' in ' '.join(interfaces.get('test').msg_queue[fake_sender]))
        ok_(self.service._channel_sub_count['testch1'] == 2)

    def test_unsubscribe_multi_not_found(self):
        self.test_subscribe_one()

        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._subscribe(['testch2'], fake_sender)
        self.service._unsubscribe(['testch3', 'testch1', 'testch2'], fake_sender)

        ok_('testch1' not in self.service._sublist[fake_sender],
            'sublist = '+str(self.service._sublist[fake_sender]))
        ok_('testch2' not in self.service._sublist[fake_sender],
            'sublist = '+str(self.service._sublist[fake_sender]))
        ok_('not found' in ' '.join(interfaces.get('test').msg_queue[fake_sender]))
        ok_(self.service._channel_sub_count['testch1'] == 1)

    def test_list_channel(self):
        self.service._twitch.set_live_channel_list({'testch2': {'display_name': 'TESTCH2'}})
        self.test_subscribe_multi()

        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._list_channel(True, fake_sender)
        ok_(' '.join(interfaces.get('test').msg_queue[fake_sender]).count('LIVE') == 1)

        check_msg = ' '.join(interfaces.get('test').msg_queue[fake_sender])
        ok_('testch2' in check_msg.lower())
        ok_('testch1' in check_msg.lower())

    def test_list_channel_invalidate_cache(self):
        self.service._twitch.set_live_channel_list({'testch2': {'display_name': 'TESTCH2'}})
        self.test_subscribe_multi()
        self.service._channel_name_cache.clear()

        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._list_channel(True, fake_sender)
        ok_(' '.join(interfaces.get('test').msg_queue[fake_sender]).count('LIVE') == 1)

        check_msg = ' '.join(interfaces.get('test').msg_queue[fake_sender])
        ok_('testch2' in check_msg.lower())
        ok_('testch1' in check_msg.lower())

    def test_refresh(self):
        # check admin only
        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()

        def self_ret():
            self_ret.val = True
        self_ret.val = False

        self.service._check_thread.refresh = self_ret

        config['interface']['test'] = {'admin_id': 'test_admin'}
        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._refresh(True, fake_sender)

        ok_(self_ret.val is not True)

        self.service._refresh(True, CommandSubmitter('test', 'test_admin'))
        ok_(self_ret.val is True)

    def test_list_users_no_user(self):
        # issue #10, list user hit exception while there is no user
        config['interface']['test'] = {'admin_id': 'test_admin'}
        try:
            os.remove(self.service.SUB_FILE)
        except OSError:
            pass

        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()

        fake_sender = CommandSubmitter('test', 'test_admin')
        self.service._list_users([], fake_sender)

        # check there is a response to user
        ok_(len(''.join(interfaces.get('test').msg_queue[fake_sender])) > 0)

    def test_list_users(self):
        self.test_subscribe_one()
        self.service._subscribe(['testch2'], CommandSubmitter('test', 'fake_sender2'))
        config['interface']['test'] = {'admin_id': 'test_admin'}

        # check admin only
        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._list_users([], fake_sender)
        ok_('Channels' not in ''.join(interfaces.get('test').msg_queue[fake_sender]))

        fake_sender = CommandSubmitter('test', 'test_admin')
        self.service._list_users([], fake_sender)

        # check msg response
        ok_('fake_sender' in ''.join(interfaces.get('test').msg_queue[fake_sender]))
        ok_('fake_sender2' in ''.join(interfaces.get('test').msg_queue[fake_sender]))
        ok_('testch1' not in ''.join(interfaces.get('test').msg_queue[fake_sender]))
        ok_('testch2' not in ''.join(interfaces.get('test').msg_queue[fake_sender]))

        # test list single user, channels
        interfaces.get('test').reset()
        for index in range(2):
            self.service._list_users([index], fake_sender)
            msg = ' '.join(interfaces.get('test').msg_queue[fake_sender])

            if 'fake_sender' in msg:
                ok_('testch1' in msg)
            elif 'fake_sender2' in msg:
                ok_('testch2' in msg)
                ok_('testch1' in msg)

        # test list multiple user channels
        interfaces.get('test').reset()
        self.service._list_users(range(2), fake_sender)
        ok_('fake_sender' in ''.join(interfaces.get('test').msg_queue[fake_sender]))
        ok_('fake_sender2' in ''.join(interfaces.get('test').msg_queue[fake_sender]))
        ok_('testch1' in ''.join(interfaces.get('test').msg_queue[fake_sender]))
        ok_('testch2' in ''.join(interfaces.get('test').msg_queue[fake_sender]))

    def test_sub_by_url(self):
        sender = CommandSubmitter('test', 'sender')
        self.service._twitch.exists_ch_list = ['KayDaDa', 'LinotServant']
        self.service.setup(self.parser)
        self.service.start()
        threading.Event().wait(1)
        self.service.stop()
        self.service._sub_by_url(['KayDaDa', 'LinotServant'], 'dummy', sender)
        ok_('KayDaDa'.lower() in self.service._sublist[sender],
            'sublist = '+str(self.service._sublist[sender]))
        ok_('LinotServant'.lower() in self.service._sublist[sender],
            'sublist = '+str(self.service._sublist[sender]))

        self.service._unsubscribe(['KayDaDa', 'LinotServant'], sender)
        ok_('KayDaDa'.lower() not in self.service._sublist[sender],
            'sublist = '+str(self.service._sublist[sender]))
        ok_('LinotServant'.lower() not in self.service._sublist[sender],
            'sublist = '+str(self.service._sublist[sender]))

        # Integration test
        self.parser.process_direct_commands('www.twitch.tv/KayDaDa twitch.tv/LinotServant', sender)
        ok_('KayDaDa'.lower() in self.service._sublist[sender],
            'sublist = '+str(self.service._sublist[sender]))
        ok_('LinotServant'.lower() in self.service._sublist[sender],
            'sublist = '+str(self.service._sublist[sender]))

    def test_unsub_all(self):
        sender = CommandSubmitter('test', 'sender')
        test_channels = ['testch1', 'testch2', 'testch3']
        self.service._twitch.set_exists_channel_list(test_channels)

        self.service.setup(self.parser)
        self.service.start()
        threading.Event().wait(1)
        self.service.stop()

        self.service._subscribe(test_channels, sender)
        self.service._list_channel(True, sender)
        # make sure subscribe success
        for ch in test_channels:
            ok_(ch.lower() in ' '.join(interfaces.get('test').msg_queue[sender]).lower())

        interfaces.get('test').reset()

        self.service._unsub_all(True, sender)
        self.service._list_channel(True, sender)
        for ch in test_channels:
            ok_(ch.lower() not in ' '.join(interfaces.get('test').msg_queue[sender]).lower())

    def test_import(self):
        sender = CommandSubmitter('test', 'tester')
        short_test_channels = ['testch'+str(x) for x in range(3)]
        long_test_channels = ['testch'+str(x) for x in range(10)]

        self.service.setup(self.parser)
        self.service.start()
        threading.Event().wait(1)
        self.service.stop()

        # test small amount of followed channel
        self.service._twitch.followed_ch_list = {'some_twitch_user': short_test_channels}
        self.service._import(['some_twitch_user'], sender)
        self.service._list_channel(True, sender)
        for ch in short_test_channels:
            ok_(ch.lower() in ' '.join(interfaces.get('test').msg_queue[sender]).lower())
        interfaces.get('test').reset()
        self.service._unsub_all(True, sender)

        # test large amount of followed channel
        self.service._twitch.followed_ch_list = {'some_twitch_user': long_test_channels}
        self.service._import(['some_twitch_user'], sender)
        self.service._list_channel(True, sender)
        for ch in long_test_channels:
            ok_(ch.lower() in ' '.join(interfaces.get('test').msg_queue[sender]).lower())
        ok_('a while' in ' '.join(interfaces.get('test').msg_queue[sender]).lower())
        interfaces.get('test').reset()
        self.service._unsub_all(True, sender)

        # test not found
        self.service._twitch.followed_ch_list = {'some_twitch_user': long_test_channels}
        self.service._import(['some_twitch_user2'], sender)
        self.service._list_channel(True, sender)
        for ch in long_test_channels:
            ok_(ch.lower() not in ' '.join(interfaces.get('test').msg_queue[sender]).lower())
        ok_('not found' in ' '.join(interfaces.get('test').msg_queue[sender]).lower())
        interfaces.get('test').reset()
        self.service._unsub_all(True, sender)
Beispiel #5
0
 def setUp(self):
     self.service = Service()
     self.service._twitch = MockTwitchEngine()
     self.parser = LinotParser(usage=argparse.SUPPRESS, add_help=False)
     interfaces.get('test').reset()
Beispiel #6
0
class TestService:
    def setUp(self):
        self.service = Service()
        self.service._twitch = MockTwitchEngine()
        self.parser = LinotParser(usage=argparse.SUPPRESS, add_help=False)
        interfaces.get('test').reset()

    def tearDown(self):
        try:
            os.remove(self.service.SUB_FILE)
        except OSError:
            pass

    def test_init(self):
        # some basic tests
        ok_(self.service.is_start() is False)
        ok_(self.service.CMD == 'twitch')

    def test_setup_argument(self):
        def set_matching_0(val, sender):
            set_matching_0.ret = (len(val) == 0)

        def set_matching_1(val, sender):
            set_matching_1.ret = (set(val) == set(['test1']))

        def set_matching_2(val, sender):
            set_matching_2.ret = (set(val) == set(['test1', 'test2']))

        def ret_val(val, sender):
            ret_val.ret = val

        def direct_cmd_set_match(match, cmd, sender):
            direct_cmd_set_match.ret = (set(match) == set(['kaydada']))

        # test argument and function relation
        test_list = [
            # -subscribe +
            ['-subscribe test1', '_subscribe', set_matching_1],
            ['-subscribe test1 test2', '_subscribe', set_matching_2],
            # -unsubscribe +
            ['-unsubscribe test1', '_unsubscribe', set_matching_1],
            ['-unsubscribe test1 test2', '_unsubscribe', set_matching_2],
            # -unsuball
            ['-unsuball', '_unsub_all', ret_val],
            ['-unsuball abc', '_unsub_all', ret_val],
            # -import
            ['-import test1', '_import', set_matching_1],
            # -listchannel
            ['-listchannel', '_list_channel', ret_val],
            ['-listchannel abc', '_list_channel', ret_val],
            # -refresh
            ['-refresh', '_refresh', ret_val],
            ['-refresh abc', '_refresh', ret_val],
            # -listusers *
            ['-listusers', '_list_users', set_matching_0],
            ['-listusers test1', '_list_users', set_matching_1],
            ['-listusers test1 test2', '_list_users', set_matching_2],
        ]

        for test in test_list:
            self.setUp()
            method_bak = None
            for name, method in inspect.getmembers(self.service,
                                                   predicate=inspect.ismethod):
                if name == test[1]:
                    method_bak = method
                    setattr(self.service, name, test[2])
            ok_(method_bak is not None, test[0] + ' case method not found')
            self.service.setup(self.parser)  # setup calls _setup_arguments
            cmd = self.service.CMD + ' ' + test[0]
            args, unknowns = self.parser.parse_known_args(cmd.split())
            test[2].ret = False
            args.proc(args, None)
            ok_(test[2].ret, 'failed: ' + test[0])

        # test direct command
        test_list = [
            # direct command: sub by url
            ['www.twitch.tv/kaydada', '_sub_by_url', direct_cmd_set_match],
        ]

        for test in test_list:
            self.setUp()
            method_bak = None
            for name, method in inspect.getmembers(self.service,
                                                   predicate=inspect.ismethod):
                if name == test[1]:
                    method_bak = method
                    setattr(self.service, name, test[2])
            ok_(method_bak is not None, test[0] + ' case method not found')
            self.service.setup(self.parser)  # setup calls _setup_arguments
            cmd = test[0]
            self.parser.process_direct_commands(cmd, None)
            ok_(test[2].ret, 'failed: ' + test[0])

    def test_start_subfile_exists(self):
        fake_sublist = {
            'testid1': ['testch1', 'testch2', 'testch3'],
            'testid2': ['testch2'],
            'testid3': ['testch1', 'testch3'],
            'testid4': ['testch2'],
        }
        pickle.dump(fake_sublist, open(self.service.SUB_FILE, 'wb+'))
        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()
        ok_(self.service._channel_sub_count['testch1'] == 2,
            'count =' + str(self.service._channel_sub_count['testch1']))
        ok_(self.service._channel_sub_count['testch2'] == 3,
            'count =' + str(self.service._channel_sub_count['testch2']))
        ok_(self.service._channel_sub_count['testch3'] == 2,
            'count =' + str(self.service._channel_sub_count['testch3']))
        ok_(self.service._channel_sub_count['testch4'] == 0,
            'count =' + str(self.service._channel_sub_count['testch4']))

    def test_start_subfile_not_found(self):
        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()
        ok_(set(self.service._sublist['testid1']) == set([]))
        ok_(set(self.service._sublist['testid2']) == set([]))
        ok_(self.service._channel_sub_count['testch1'] == 0,
            'count =' + str(self.service._channel_sub_count['testch1']))
        ok_(self.service._channel_sub_count['testch2'] == 0,
            'count =' + str(self.service._channel_sub_count['testch2']))

    def test_get_sublist(self):
        fake_sublist = {
            'testid1': ['testch1', 'testch2', 'testch3'],
            'testid2': ['testch2'],
            'testid3': ['testch1', 'testch3'],
        }
        pickle.dump(fake_sublist, open(self.service.SUB_FILE, 'wb+'))
        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()
        sublist = self.service.get_sublist()
        ok_(len(fake_sublist.viewkeys() ^ sublist.viewkeys()) == 0)
        for key in fake_sublist:
            ok_(set(fake_sublist[key]) == set(sublist[key]))

    def test_calculate_channel_count(self):
        self.service._sublist = {
            'testid1': ['testch1', 'testch2', 'testch3'],
            'testid2': ['testch2'],
            'testid3': ['testch1', 'testch3', 'testch2'],
        }
        self.service._calculate_channel_sub_count()
        ok_(self.service._channel_sub_count['testch1'] == 2)
        ok_(self.service._channel_sub_count['testch2'] == 3)
        ok_(self.service._channel_sub_count['testch3'] == 2)
        ok_(self.service._channel_sub_count['testch4'] == 0)
        self.service._sublist = defaultdict(list)
        self.service._calculate_channel_sub_count()
        ok_(self.service._channel_sub_count['testch1'] == 0)
        ok_(self.service._channel_sub_count['testch2'] == 0)
        ok_(self.service._channel_sub_count['testch3'] == 0)
        ok_(self.service._channel_sub_count['testch4'] == 0)

    def test_subscribe_one(self):
        try:
            os.remove(self.service.SUB_FILE)
        except OSError:
            pass

        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()

        self.service._twitch.set_exists_channel_list(['testch1', 'testch2'])
        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._subscribe(['testch1'], fake_sender)

        ok_(
            'testch1'
            in [x.lower() for x in self.service._sublist[fake_sender]],
            'sublist = ' + str(self.service._sublist[fake_sender]))
        ok_('not found' not in ' '.join(
            interfaces.get('test').msg_queue[fake_sender]))
        ok_(self.service._channel_sub_count['testch1'] == 1)

        fake_sender2 = CommandSubmitter('test', 'fake_sender2')
        self.service._subscribe(['testch1'], fake_sender2)

        ok_(self.service._channel_sub_count['testch1'] == 2)

    def test_subscribe_one_exists(self):
        try:
            os.remove(self.service.SUB_FILE)
        except OSError:
            pass
        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()

        self.service._twitch.set_exists_channel_list(['testch1', 'testch2'])
        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._sublist[fake_sender] = ['testch1']
        self.service._subscribe(['testch1'], fake_sender)

        ok_(self.service._sublist[fake_sender].count('testch1') == 1,
            'sublist = ' + str(self.service._sublist[fake_sender]))
        ok_('not found' not in ' '.join(
            interfaces.get('test').msg_queue[fake_sender]))

    def test_subscribe_one_not_found(self):
        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()

        self.service._twitch.set_exists_channel_list(['testch2', 'testch3'])
        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._subscribe(['testch1'], fake_sender)

        ok_('testch1' not in self.service._sublist[fake_sender],
            'sublist = ' + str(self.service._sublist[fake_sender]))
        ok_('not found' in ' '.join(
            interfaces.get('test').msg_queue[fake_sender]))

    def test_subscribe_multi(self):
        try:
            os.remove(self.service.SUB_FILE)
        except OSError:
            pass
        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()

        self.service._twitch.set_exists_channel_list(['testch1', 'testch2'])
        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._subscribe(['testch1', 'testch2'], fake_sender)
        ok_('testch1' in self.service._sublist[fake_sender],
            'sublist = ' + str(self.service._sublist[fake_sender]))
        ok_('testch2' in self.service._sublist[fake_sender],
            'sublist = ' + str(self.service._sublist[fake_sender]))
        ok_('not found' not in ' '.join(
            interfaces.get('test').msg_queue[fake_sender]))

    def test_unsubscribe_one(self):
        self.test_subscribe_one()

        fake_sender = CommandSubmitter('test', 'fake_sender')
        fake_sender2 = CommandSubmitter('test', 'fake_sender2')
        self.service._subscribe(['testch2'], fake_sender)
        self.service._unsubscribe(['testch1'], fake_sender)

        ok_('testch1' not in self.service._sublist[fake_sender],
            'sublist = ' + str(self.service._sublist[fake_sender]))
        ok_('not found' not in ' '.join(
            interfaces.get('test').msg_queue[fake_sender]))
        ok_(self.service._channel_sub_count['testch1'] == 1)

        self.service._unsubscribe(['testch1'], fake_sender2)

        ok_('testch1' not in self.service._sublist[fake_sender2],
            'sublist = ' + str(self.service._sublist[fake_sender2]))
        ok_(self.service._channel_sub_count['testch1'] == 0)

    def test_unsubscribe_one_not_found(self):
        self.test_subscribe_one()

        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._subscribe(['testch2'], fake_sender)
        self.service._unsubscribe(['testch3'], fake_sender)

        ok_('testch1' in self.service._sublist[fake_sender],
            'sublist = ' + str(self.service._sublist[fake_sender]))
        ok_('testch2' in self.service._sublist[fake_sender],
            'sublist = ' + str(self.service._sublist[fake_sender]))
        ok_('not found' in ' '.join(
            interfaces.get('test').msg_queue[fake_sender]))
        ok_(self.service._channel_sub_count['testch1'] == 2)

    def test_unsubscribe_multi_not_found(self):
        self.test_subscribe_one()

        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._subscribe(['testch2'], fake_sender)
        self.service._unsubscribe(['testch3', 'testch1', 'testch2'],
                                  fake_sender)

        ok_('testch1' not in self.service._sublist[fake_sender],
            'sublist = ' + str(self.service._sublist[fake_sender]))
        ok_('testch2' not in self.service._sublist[fake_sender],
            'sublist = ' + str(self.service._sublist[fake_sender]))
        ok_('not found' in ' '.join(
            interfaces.get('test').msg_queue[fake_sender]))
        ok_(self.service._channel_sub_count['testch1'] == 1)

    def test_list_channel(self):
        self.service._twitch.set_live_channel_list(
            {'testch2': {
                'display_name': 'TESTCH2'
            }})
        self.test_subscribe_multi()

        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._list_channel(True, fake_sender)
        ok_(' '.join(interfaces.get('test').msg_queue[fake_sender]).count(
            'LIVE') == 1)

        check_msg = ' '.join(interfaces.get('test').msg_queue[fake_sender])
        ok_('testch2' in check_msg.lower())
        ok_('testch1' in check_msg.lower())

    def test_list_channel_invalidate_cache(self):
        self.service._twitch.set_live_channel_list(
            {'testch2': {
                'display_name': 'TESTCH2'
            }})
        self.test_subscribe_multi()
        self.service._channel_name_cache.clear()

        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._list_channel(True, fake_sender)
        ok_(' '.join(interfaces.get('test').msg_queue[fake_sender]).count(
            'LIVE') == 1)

        check_msg = ' '.join(interfaces.get('test').msg_queue[fake_sender])
        ok_('testch2' in check_msg.lower())
        ok_('testch1' in check_msg.lower())

    def test_refresh(self):
        # check admin only
        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()

        def self_ret():
            self_ret.val = True

        self_ret.val = False

        self.service._check_thread.refresh = self_ret

        config['interface']['test'] = {'admin_id': 'test_admin'}
        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._refresh(True, fake_sender)

        ok_(self_ret.val is not True)

        self.service._refresh(True, CommandSubmitter('test', 'test_admin'))
        ok_(self_ret.val is True)

    def test_list_users_no_user(self):
        # issue #10, list user hit exception while there is no user
        config['interface']['test'] = {'admin_id': 'test_admin'}
        try:
            os.remove(self.service.SUB_FILE)
        except OSError:
            pass

        self.service.start()
        threading.Event().wait(.1)
        self.service.stop()

        fake_sender = CommandSubmitter('test', 'test_admin')
        self.service._list_users([], fake_sender)

        # check there is a response to user
        ok_(len(''.join(interfaces.get('test').msg_queue[fake_sender])) > 0)

    def test_list_users(self):
        self.test_subscribe_one()
        self.service._subscribe(['testch2'],
                                CommandSubmitter('test', 'fake_sender2'))
        config['interface']['test'] = {'admin_id': 'test_admin'}

        # check admin only
        fake_sender = CommandSubmitter('test', 'fake_sender')
        self.service._list_users([], fake_sender)
        ok_('Channels' not in ''.join(
            interfaces.get('test').msg_queue[fake_sender]))

        fake_sender = CommandSubmitter('test', 'test_admin')
        self.service._list_users([], fake_sender)

        # check msg response
        ok_('fake_sender' in ''.join(
            interfaces.get('test').msg_queue[fake_sender]))
        ok_('fake_sender2' in ''.join(
            interfaces.get('test').msg_queue[fake_sender]))
        ok_('testch1' not in ''.join(
            interfaces.get('test').msg_queue[fake_sender]))
        ok_('testch2' not in ''.join(
            interfaces.get('test').msg_queue[fake_sender]))

        # test list single user, channels
        interfaces.get('test').reset()
        for index in range(2):
            self.service._list_users([index], fake_sender)
            msg = ' '.join(interfaces.get('test').msg_queue[fake_sender])

            if 'fake_sender' in msg:
                ok_('testch1' in msg)
            elif 'fake_sender2' in msg:
                ok_('testch2' in msg)
                ok_('testch1' in msg)

        # test list multiple user channels
        interfaces.get('test').reset()
        self.service._list_users(range(2), fake_sender)
        ok_('fake_sender' in ''.join(
            interfaces.get('test').msg_queue[fake_sender]))
        ok_('fake_sender2' in ''.join(
            interfaces.get('test').msg_queue[fake_sender]))
        ok_('testch1' in ''.join(
            interfaces.get('test').msg_queue[fake_sender]))
        ok_('testch2' in ''.join(
            interfaces.get('test').msg_queue[fake_sender]))

    def test_sub_by_url(self):
        sender = CommandSubmitter('test', 'sender')
        self.service._twitch.exists_ch_list = ['KayDaDa', 'LinotServant']
        self.service.setup(self.parser)
        self.service.start()
        threading.Event().wait(1)
        self.service.stop()
        self.service._sub_by_url(['KayDaDa', 'LinotServant'], 'dummy', sender)
        ok_('KayDaDa'.lower() in self.service._sublist[sender],
            'sublist = ' + str(self.service._sublist[sender]))
        ok_('LinotServant'.lower() in self.service._sublist[sender],
            'sublist = ' + str(self.service._sublist[sender]))

        self.service._unsubscribe(['KayDaDa', 'LinotServant'], sender)
        ok_('KayDaDa'.lower() not in self.service._sublist[sender],
            'sublist = ' + str(self.service._sublist[sender]))
        ok_('LinotServant'.lower() not in self.service._sublist[sender],
            'sublist = ' + str(self.service._sublist[sender]))

        # Integration test
        self.parser.process_direct_commands(
            'www.twitch.tv/KayDaDa twitch.tv/LinotServant', sender)
        ok_('KayDaDa'.lower() in self.service._sublist[sender],
            'sublist = ' + str(self.service._sublist[sender]))
        ok_('LinotServant'.lower() in self.service._sublist[sender],
            'sublist = ' + str(self.service._sublist[sender]))

    def test_unsub_all(self):
        sender = CommandSubmitter('test', 'sender')
        test_channels = ['testch1', 'testch2', 'testch3']
        self.service._twitch.set_exists_channel_list(test_channels)

        self.service.setup(self.parser)
        self.service.start()
        threading.Event().wait(1)
        self.service.stop()

        self.service._subscribe(test_channels, sender)
        self.service._list_channel(True, sender)
        # make sure subscribe success
        for ch in test_channels:
            ok_(ch.lower() in ' '.join(
                interfaces.get('test').msg_queue[sender]).lower())

        interfaces.get('test').reset()

        self.service._unsub_all(True, sender)
        self.service._list_channel(True, sender)
        for ch in test_channels:
            ok_(ch.lower() not in ' '.join(
                interfaces.get('test').msg_queue[sender]).lower())

    def test_import(self):
        sender = CommandSubmitter('test', 'tester')
        short_test_channels = ['testch' + str(x) for x in range(3)]
        long_test_channels = ['testch' + str(x) for x in range(10)]

        self.service.setup(self.parser)
        self.service.start()
        threading.Event().wait(1)
        self.service.stop()

        # test small amount of followed channel
        self.service._twitch.followed_ch_list = {
            'some_twitch_user': short_test_channels
        }
        self.service._import(['some_twitch_user'], sender)
        self.service._list_channel(True, sender)
        for ch in short_test_channels:
            ok_(ch.lower() in ' '.join(
                interfaces.get('test').msg_queue[sender]).lower())
        interfaces.get('test').reset()
        self.service._unsub_all(True, sender)

        # test large amount of followed channel
        self.service._twitch.followed_ch_list = {
            'some_twitch_user': long_test_channels
        }
        self.service._import(['some_twitch_user'], sender)
        self.service._list_channel(True, sender)
        for ch in long_test_channels:
            ok_(ch.lower() in ' '.join(
                interfaces.get('test').msg_queue[sender]).lower())
        ok_('a while' in ' '.join(interfaces.get(
            'test').msg_queue[sender]).lower())
        interfaces.get('test').reset()
        self.service._unsub_all(True, sender)

        # test not found
        self.service._twitch.followed_ch_list = {
            'some_twitch_user': long_test_channels
        }
        self.service._import(['some_twitch_user2'], sender)
        self.service._list_channel(True, sender)
        for ch in long_test_channels:
            ok_(ch.lower() not in ' '.join(
                interfaces.get('test').msg_queue[sender]).lower())
        ok_('not found' in ' '.join(interfaces.get(
            'test').msg_queue[sender]).lower())
        interfaces.get('test').reset()
        self.service._unsub_all(True, sender)