def test_str_representation(self):
        # incrementally adds attributes and checks if they appear in str(item).
        # The str representation is important for several chat commands.
        identifier = UserIdentifier('foo', 'bar')
        # str needs to work without password and data
        self.assertIn('foo', str(identifier))
        self.assertIn('bar', str(identifier))

        identifier.password = '******'
        self.assertIn('passw0rd!', str(identifier))

        data = UserData()
        state_str = data.state_string()
        self.assertIn(state_str, str(data))

        # this is 1970-01-01 00:01:40
        data.valid_until = 100
        data.num_joins = 42
        data.max_num_joins = 1234
        # keep some freedoms on the actual output
        self.assertIn('1970', str(data))
        self.assertIn('00:01:40', str(data))
        self.assertIn('42', str(data))
        self.assertIn('1234', str(data))

        data_str = str(data)
        identifier.user_data = data
        self.assertIn(data_str, str(identifier))
    def test_check_expired_time_and_num_one_exceeded(self):
        # num exceeded
        data = UserData()
        data.max_num_joins = 1
        data.num_joins = 2
        data.valid_until = time.time() + 10000

        self._run_check_expired(data, True)

        # time exceeded
        data = UserData()
        data.max_num_joins = 1
        data.num_joins = 0
        data.valid_until = time.time() - 10000

        self._run_check_expired(data, True)
    def test_check_expired_time_and_num_both_exceeded(self):
        data = UserData()
        data.max_num_joins = 1
        data.num_joins = 2
        data.valid_until = time.time() - 10000

        self._run_check_expired(data, True)
    def _increment_num_join_helper(self, max_num_joins, num_joins, valid_until,
                                   expected_num_joins):
        data = UserData()
        data.max_num_joins = max_num_joins
        data.num_joins = num_joins
        data.valid_until = valid_until

        data.check_expired(True)

        self.assertEqual(data.num_joins, expected_num_joins)
    def test_may_join_other_object(self):
        # should work with an independent object having the same attributes
        data = UserData()
        data.max_num_joins = 1
        data.valid_until = time.time() + 10000
        mgr, testuser = self._get_mgr_with_one_user_and_data(data)

        result = mgr.may_join(UserIdentifier('foo', 'bar'))

        self.assert_state_allowed(result)
    def test_may_join_other_name_different_id_format(self):
        # also reject when the device IDs are formatted differently
        data = UserData()
        data.max_num_joins = 1
        data.valid_until = time.time() + 10000
        user = UserIdentifier('foo', 'AB-C0')
        mgr = self._get_mgr_with(user, data)

        result = mgr.may_join(UserIdentifier('other', 'ab:c0'))

        self.assert_state_blocked(result)
    def test_may_join_blocked_user(self):
        data = UserData()
        data.max_num_joins = 1
        data.num_joins = 2
        valid_time = time.time() - 10000
        data.valid_until = valid_time
        data.join_state = UserData.JOIN_STATE_BLOCKED
        mgr, testuser = self._get_mgr_with_one_user_and_data(data)

        result = mgr.may_join(testuser)

        self.assert_state_blocked(result)
        # attributes should be unchanged
        self.assertEqual(data.max_num_joins, 1)
        self.assertEqual(data.num_joins, 2)
        self.assertEqual(data.valid_until, valid_time)
    def test_may_join_other_name(self):
        # reject other users having the same device ID
        data = UserData()
        data.max_num_joins = 1
        data.valid_until = time.time() + 10000
        mgr, testuser = self._get_mgr_with_one_user_and_data(data)

        result = mgr.may_join(UserIdentifier('other', 'bar'))

        self.assert_state_blocked(result)

        # this should also apply if the stored user has no assigned data
        # (i.e. no state)
        mgr, testuser = self._get_mgr_with_one_user()

        result = mgr.may_join(UserIdentifier('other', 'bar'))

        self.assert_state_blocked(result)
    def test_check_expired_time_and_num_valid(self):
        data = UserData()
        data.max_num_joins = 1
        data.valid_until = time.time() + 10000

        self._run_check_expired(data, False)
    def test_check_expired_time_exceeded(self):
        data = UserData()
        data.valid_until = time.time() - 10000

        self._run_check_expired(data, True)
    def test_check_expired_time(self):
        data = UserData()
        data.valid_until = time.time() + 10000

        self._run_check_expired(data, False)