예제 #1
0
def main():
    if len(sys.argv) < 4:
        usage()
        exit()
    db = TahrirDatabase(sys.argv[1])
    issuer_id = db.add_issuer(
            "http://coderwall.com",
            "coderwall",
            "http://coderwall.com",
            "*****@*****.**"
            )
    db.add_person(hash(sys.argv[3]), sys.argv[3])
    cw = CoderWall(sys.argv[2])
    for badge in cw.badges:
        db.add_badge(
                badge.name,
                badge.image_uri,
                badge.description,
                "http://coderwall.com",
                issuer_id)
        db.add_assertion(
                badge.name.lower(),
                sys.argv[3],
                None
                )

    print "Awarded {0} badges to {1}".format(len(cw.badges), sys.argv[3])
예제 #2
0
class TestRanking(object):

    def setUp(self):
        check_output(['touch', 'testdb.db'])
        sqlalchemy_uri = "sqlite:///testdb.db"
        engine = create_engine(sqlalchemy_uri)
        DBSession.configure(bind=engine)
        DeclarativeBase.metadata.create_all(engine)

        self.api = TahrirDatabase(sqlalchemy_uri)
        self._create_test_data()

    def tearDown(self):
        check_output(['rm', 'testdb.db'])

    def _create_test_data(self):
        issuer_id = self.api.add_issuer(
            "TestOrigin",
            "TestName",
            "TestOrg",
            "TestContact"
        )
        self.badge_id_1 = self.api.add_badge(
            "TestBadge1",
            "TestImage",
            "A test badge for doing unit tests",
            "TestCriteria",
            issuer_id,
        )
        self.badge_id_2 = self.api.add_badge(
            "TestBadge2",
            "TestImage",
            "A test badge for doing unit tests",
            "TestCriteria",
            issuer_id,
        )
        self.badge_id_3 = self.api.add_badge(
            "TestBadge3",
            "TestImage",
            "A test badge for doing unit tests",
            "TestCriteria",
            issuer_id,
        )
        self.email_1 = "*****@*****.**"
        person_id_1 = self.api.add_person(self.email_1)
        self.email_2 = "*****@*****.**"
        person_id_2 = self.api.add_person(self.email_2)
        self.email_3 = "*****@*****.**"
        person_id_3 = self.api.add_person(self.email_3)
        self.email_4 = "*****@*****.**"
        person_id_4 = self.api.add_person(self.email_4)

    def test_ranking_simple(self):
        self.api.add_assertion(self.badge_id_1, self.email_1, None)

        self.api.add_assertion(self.badge_id_1, self.email_4, None)
        self.api.add_assertion(self.badge_id_2, self.email_4, None)
        self.api.add_assertion(self.badge_id_3, self.email_4, None)

        person1 = self.api.get_person("*****@*****.**")
        person4 = self.api.get_person("*****@*****.**")

        eq_(person1.rank, 2)
        eq_(person4.rank, 1)

    def test_ranking_tie(self):
        self.api.add_assertion(self.badge_id_1, self.email_1, None)

        self.api.add_assertion(self.badge_id_1, self.email_2, None)
        self.api.add_assertion(self.badge_id_2, self.email_2, None)

        self.api.add_assertion(self.badge_id_1, self.email_3, None)
        self.api.add_assertion(self.badge_id_2, self.email_3, None)

        self.api.add_assertion(self.badge_id_1, self.email_4, None)
        self.api.add_assertion(self.badge_id_2, self.email_4, None)
        self.api.add_assertion(self.badge_id_3, self.email_4, None)

        person1 = self.api.get_person("*****@*****.**")
        person2 = self.api.get_person("*****@*****.**")
        person3 = self.api.get_person("*****@*****.**")
        person4 = self.api.get_person("*****@*****.**")

        eq_(person1.rank, 4)
        eq_(person2.rank, 2)
        eq_(person3.rank, 2)
        eq_(person4.rank, 1)

    def test_ranking_preexisting(self):
        """ Test that rank updating works for pre-existant users """
        person1 = self.api.get_person("*****@*****.**")
        new_assertion1 = Assertion(
            badge_id=self.badge_id_1,
            person_id=person1.id,
        )
        self.api.session.add(new_assertion1)
        new_assertion2 = Assertion(
            badge_id=self.badge_id_2,
            person_id=person1.id,
        )
        self.api.session.add(new_assertion2)
        self.api.session.flush()

        # For persons who existed *before* we added cached ranks, they should
        # have a null-rank.
        eq_(person1.rank, None)

        # But once *anyone* else gets a badge, old ranks should be updated too.
        self.api.add_assertion(self.badge_id_1, self.email_2, None)
        eq_(person1.rank, 1)

        person2 = self.api.get_person("*****@*****.**")
        eq_(person2.rank, 2)

        # but people with no badges should still be null ranked.
        person3 = self.api.get_person("*****@*****.**")
        eq_(person3.rank, None)

    def test_ranking_with_time_limits(self):
        self.api.add_assertion(self.badge_id_1, self.email_1, yesterday)

        self.api.add_assertion(self.badge_id_1, self.email_4, yesterday)
        self.api.add_assertion(self.badge_id_2, self.email_4, one_week_ago)
        self.api.add_assertion(self.badge_id_3, self.email_4, one_month_ago)

        person1 = self.api.get_person("*****@*****.**")
        person4 = self.api.get_person("*****@*****.**")

        epsilon = datetime.timedelta(hours=1)

        results = self.api._make_leaderboard(yesterday - epsilon, now)
        eq_(results[person1]['badges'], 1)
        eq_(results[person4]['badges'], 1)

        results = self.api._make_leaderboard(one_week_ago - epsilon, now)
        eq_(results[person1]['badges'], 1)
        eq_(results[person4]['badges'], 2)

        results = self.api._make_leaderboard(one_month_ago - epsilon, now)
        eq_(results[person1]['badges'], 1)
        eq_(results[person4]['badges'], 3)
예제 #3
0
class FedoraBadgesConsumer(FedmsgConsumer):
    """
    The Base class for creating fedmsg consumers that issue open badges
    Provides a base that does all of the heavy lifting related to issuing badges.
    All the subclass needs to do is have a topic, a name, and implement consume(self, msg)

    :type hub: Moksha Hub
    :param hub: the moksha hub we are getting our messages from

    :type name: str
    :param name: name of this consumer, used to get details from the config file
    """

    def __init__(self, hub, name):
        self.name = name
        self.badges = {}
        self.hub = hub
        self.DBSession = None
        ENABLED = "fedmsg.consumers.badges.{0}.enabled".format(self.name)
        if not asbool(hub.config.get(ENABLED, False)):
            log.info("fedmsg.consumers.badges.{0} disabled".format(self.name))
            return

        global_settings = hub.config.get("badges_global")

        database_uri = global_settings.get("database_uri", "")
        if database_uri == "":
            raise Exception("Badges consumer requires a database uri")
            return
        self.tahrir = TahrirDatabase(database_uri)
        self.DBSession = self.tahrir.session_maker
        issuer = global_settings.get("badge_issuer")
        self.issuer_id = self.tahrir.add_issuer(
            issuer.get("issuer_origin"),
            issuer.get("issuer_name"),
            issuer.get("issuer_org"),
            issuer.get("issuer_contact"),
        )

        badges_settings = hub.config.get("{0}_badges".format(self.name))
        for badge in badges_settings:
            self.tahrir.add_badge(
                badge.get("badge_name"),
                badge.get("badge_image"),
                badge.get("badge_desc"),
                badge.get("badge_criteria"),
                self.issuer_id,
            )
        return super(FedoraBadgesConsumer, self).__init__(hub)

    def award_badge(self, email, badge_id, issued_on=None):
        """
        A high level way to issue a badge to a Person
        It adds the person if they don't exist, and creates an assertion for them

        :type email: str
        :param email: This person's email addr

        :type badge_id: str
        :param badge_id: the id of the badge being awarded

        :type issued_on: DateTime
        :param issued_on: A datetime object with the time this badge was issued
        """

        self.tahrir.add_person(email)
        self.tahrir.add_assertion(badge_id, email, issued_on)

    def consume(self, msg):
        """
        Consume a single message, we pass here because every subclass is going
        to want to parse this slightly differently

        :type msg: dict
        :param msg: The message to be parsed
        """
        pass
예제 #4
0
class TestDBInit(object):

    def setUp(self):
        check_output(['touch', 'testdb.db'])
        sqlalchemy_uri = "sqlite:///testdb.db"
        engine = create_engine(sqlalchemy_uri)
        DBSession.configure(bind=engine)
        DeclarativeBase.metadata.create_all(engine)

        self.callback_calls = []
        self.api = TahrirDatabase(
            sqlalchemy_uri,
            notification_callback=self.callback)

    def callback(self, *args, **kwargs):
        self.callback_calls.append((args, kwargs))

    def test_add_badges(self):
        self.api.add_badge(
            "TestBadge",
            "TestImage",
            "A test badge for doing unit tests",
            "TestCriteria",
            1337
        )

        assert self.api.badge_exists("testbadge") is True

    def test_add_team(self):
        self.api.create_team("TestTeam")

        assert self.api.team_exists("testteam") is True

    def test_add_series(self):
        team_id = self.api.create_team("TestTeam")

        self.api.create_series("TestSeries",
                               "A test series",
                               team_id,
                               "test, series")

        assert self.api.series_exists("testseries") is True

    def test_add_milestone(self):
        team_id = self.api.create_team("TestTeam")

        series_id = self.api.create_series("TestSeries",
                                           "A test series",
                                           team_id,
                                           "test, series")

        badge_id_1 = self.api.add_badge(
            "TestBadge-1",
            "TestImage-2",
            "A test badge for doing 10 unit tests",
            "TestCriteria",
            1337
        )

        badge_id_2 = self.api.add_badge(
            "TestBadge-2",
            "TestImage-2",
            "A test badge for doing 100 unit tests",
            "TestCriteria",
            1337
        )

        milestone_id_1 = self.api.create_milestone(1,
                                         badge_id_1,
                                         series_id)

        milestone_id_2 = self.api.create_milestone(2,
                                         badge_id_2,
                                         series_id)

        assert self.api.milestone_exists(milestone_id_1) is True
        assert self.api.milestone_exists(milestone_id_2) is True

    def test_add_person(self):
        self.api.add_person("*****@*****.**")
        assert self.api.person_exists("*****@*****.**") is True

    def test_add_issuer(self):
        _id = self.api.add_issuer(
            "TestOrigin",
            "TestName",
            "TestOrg",
            "TestContact"
        )
        assert self.api.issuer_exists("TestOrigin", "TestName") is True

    def test_add_invitation(self):
        badge_id = self.api.add_badge(
            "TestBadge",
            "TestImage",
            "A test badge for doing unit tests",
            "TestCriteria",
            1337
        )
        _id = self.api.add_invitation(
            badge_id,
        )

        assert self.api.invitation_exists(_id)

    def test_last_login(self):
        email = "*****@*****.**"
        person_id = self.api.add_person(email)
        person = self.api.get_person(person_id)
        assert not person.last_login
        self.api.note_login(nickname=person.nickname)
        assert person.last_login

    def test_add_assertion(self):
        issuer_id = self.api.add_issuer(
            "TestOrigin",
            "TestName",
            "TestOrg",
            "TestContact"
        )
        badge_id = self.api.add_badge(
            "TestBadge",
            "TestImage",
            "A test badge for doing unit tests",
            "TestCriteria",
            issuer_id,
        )
        email = "*****@*****.**"
        person_id = self.api.add_person(email)
        assertion_id = self.api.add_assertion(badge_id, email, None, 'link')
        assert self.api.assertion_exists(badge_id, email)

        badge = self.api.get_badge(badge_id)
        assert badge.assertions[0].issued_for == 'link'

        # Ensure that we would have published two fedmsg messages for that.
        assert len(self.callback_calls) == 2

        # Ensure that the first message had a 'badge_id' in the message.
        assert 'badge_id' in self.callback_calls[0][1]['msg']['badge']

    def test_get_badges_from_tags(self):
        issuer_id = self.api.add_issuer(
            "TestOrigin",
            "TestName",
            "TestOrg",
            "TestContact"
        )

        # Badge tagged with "test"
        self.api.add_badge(
            "TestBadgeA",
            "TestImage",
            "A test badge for doing unit tests",
            "TestCriteria",
            issuer_id,
            tags="test"
        )

        # Badge tagged with "tester"
        self.api.add_badge(
            "TestBadgeB",
            "TestImage",
            "A second test badge for doing unit tests",
            "TestCriteria",
            issuer_id,
            tags="tester"
        )

        # Badge tagged with both "test" and "tester"
        self.api.add_badge(
            "TestBadgeC",
            "TestImage",
            "A third test badge for doing unit tests",
            "TestCriteria",
            issuer_id,
            tags="test, tester"
        )

        tags = ['test', 'tester']
        badges_any = self.api.get_badges_from_tags(tags, match_all=False)
        assert len(badges_any) == 3
        badges_all = self.api.get_badges_from_tags(tags, match_all=True)
        assert len(badges_all) == 1

    def tearDown(self):
        check_output(['rm', 'testdb.db'])
        self.callback_calls = []
예제 #5
0
from tahrir_api.dbapi import TahrirDatabase

db = TahrirDatabase('backend://*****:*****@localhost/badges')

origin = 'http://foss.rit.edu/badges'
issuer_name = 'FOSS@RIT'
org = 'http://foss.rit.edu'
contact = '*****@*****.**'

issuer_id = db.add_issuer(origin, issuer_name, org, contact)

badge_name = 'fossbox'
image = 'http://foss.rit.edu/files/fossboxbadge.png'
desc = 'Welcome to the FOSSBox. A member is you!'
criteria = 'http://foss.rit.edu'

db.add_badge(badge_name, image, desc, criteria, issuer_id)
예제 #6
0
from tahrir_api.dbapi import TahrirDatabase


db = TahrirDatabase("backend://*****:*****@localhost/badges")

origin = "http://foss.rit.edu/badges"
issuer_name = "FOSS@RIT"
org = "http://foss.rit.edu"
contact = "*****@*****.**"

issuer_id = db.add_issuer(origin, issuer_name, org, contact)


badge_name = "fossbox"
image = "http://foss.rit.edu/files/fossboxbadge.png"
desc = "Welcome to the FOSSBox. A member is you!"
criteria = "http://foss.rit.edu"

db.add_badge(badge_name, image, desc, criteria, issuer_id)
예제 #7
0
class FedoraBadgesConsumer(FedmsgConsumer):
    """
    The Base class for creating fedmsg consumers that issue open badges
    Provides a base that does all of the heavy lifting related to issuing badges.
    All the subclass needs to do is have a topic, a name, and implement consume(self, msg)

    :type hub: Moksha Hub
    :param hub: the moksha hub we are getting our messages from

    :type name: str
    :param name: name of this consumer, used to get details from the config file
    """
    def __init__(self, hub, name):
        self.name = name
        self.badges = {}
        self.hub = hub
        self.DBSession = None
        ENABLED = 'fedmsg.consumers.badges.{0}.enabled'.format(self.name)
        if not asbool(hub.config.get(ENABLED, False)):
            log.info('fedmsg.consumers.badges.{0} disabled'.format(self.name))
            return

        global_settings = hub.config.get("badges_global")

        database_uri = global_settings.get('database_uri', '')
        if database_uri == '':
            raise Exception('Badges consumer requires a database uri')
            return
        self.tahrir = TahrirDatabase(database_uri)
        self.DBSession = self.tahrir.session_maker
        issuer = global_settings.get('badge_issuer')
        self.issuer_id = self.tahrir.add_issuer(issuer.get('issuer_origin'),
                                                issuer.get('issuer_name'),
                                                issuer.get('issuer_org'),
                                                issuer.get('issuer_contact'))

        badges_settings = hub.config.get("{0}_badges".format(self.name))
        for badge in badges_settings:
            self.tahrir.add_badge(badge.get('badge_name'),
                                  badge.get('badge_image'),
                                  badge.get('badge_desc'),
                                  badge.get('badge_criteria'), self.issuer_id)
        return super(FedoraBadgesConsumer, self).__init__(hub)

    def award_badge(self, email, badge_id, issued_on=None):
        """
        A high level way to issue a badge to a Person
        It adds the person if they don't exist, and creates an assertion for them

        :type email: str
        :param email: This person's email addr

        :type badge_id: str
        :param badge_id: the id of the badge being awarded

        :type issued_on: DateTime
        :param issued_on: A datetime object with the time this badge was issued
        """

        self.tahrir.add_person(email)
        self.tahrir.add_assertion(badge_id, email, issued_on)

    def consume(self, msg):
        """
        Consume a single message, we pass here because every subclass is going
        to want to parse this slightly differently

        :type msg: dict
        :param msg: The message to be parsed
        """
        pass
예제 #8
0
class TestDBInit(object):
    def setUp(self):
        check_output(['touch', 'testdb.db'])
        sqlalchemy_uri = "sqlite:///testdb.db"
        engine = create_engine(sqlalchemy_uri)
        DBSession.configure(bind=engine)
        DeclarativeBase.metadata.create_all(engine)

        self.callback_calls = []
        self.api = TahrirDatabase(sqlalchemy_uri,
                                  notification_callback=self.callback)

    def callback(self, *args, **kwargs):
        self.callback_calls.append((args, kwargs))

    def test_add_badges(self):
        self.api.add_badge("TestBadge", "TestImage",
                           "A test badge for doing unit tests", "TestCriteria",
                           1337)

        assert self.api.badge_exists("testbadge") is True

    def test_add_team(self):
        self.api.create_team("TestTeam")

        assert self.api.team_exists("testteam") is True

    def test_add_series(self):
        team_id = self.api.create_team("TestTeam")

        self.api.create_series("TestSeries", "A test series", team_id,
                               "test, series")

        assert self.api.series_exists("testseries") is True

    def test_add_milestone(self):
        team_id = self.api.create_team("TestTeam")

        series_id = self.api.create_series("TestSeries", "A test series",
                                           team_id, "test, series")

        badge_id_1 = self.api.add_badge(
            "TestBadge-1", "TestImage-2",
            "A test badge for doing 10 unit tests", "TestCriteria", 1337)

        badge_id_2 = self.api.add_badge(
            "TestBadge-2", "TestImage-2",
            "A test badge for doing 100 unit tests", "TestCriteria", 1337)

        milestone_id_1 = self.api.create_milestone(1, badge_id_1, series_id)

        milestone_id_2 = self.api.create_milestone(2, badge_id_2, series_id)

        assert self.api.milestone_exists(milestone_id_1) is True
        assert self.api.milestone_exists(milestone_id_2) is True

    def test_add_person(self):
        self.api.add_person("*****@*****.**")
        assert self.api.person_exists("*****@*****.**") is True

    def test_add_issuer(self):
        _id = self.api.add_issuer("TestOrigin", "TestName", "TestOrg",
                                  "TestContact")
        assert self.api.issuer_exists("TestOrigin", "TestName") is True

    def test_add_invitation(self):
        badge_id = self.api.add_badge("TestBadge", "TestImage",
                                      "A test badge for doing unit tests",
                                      "TestCriteria", 1337)
        _id = self.api.add_invitation(badge_id, )

        assert self.api.invitation_exists(_id)

    def test_last_login(self):
        email = "*****@*****.**"
        person_id = self.api.add_person(email)
        person = self.api.get_person(person_id)
        assert not person.last_login
        self.api.note_login(nickname=person.nickname)
        assert person.last_login

    def test_add_assertion(self):
        issuer_id = self.api.add_issuer("TestOrigin", "TestName", "TestOrg",
                                        "TestContact")
        badge_id = self.api.add_badge(
            "TestBadge",
            "TestImage",
            "A test badge for doing unit tests",
            "TestCriteria",
            issuer_id,
        )
        email = "*****@*****.**"
        person_id = self.api.add_person(email)
        assertion_id = self.api.add_assertion(badge_id, email, None, 'link')
        assert self.api.assertion_exists(badge_id, email)

        badge = self.api.get_badge(badge_id)
        assert badge.assertions[0].issued_for == 'link'

        # Ensure that we would have published two fedmsg messages for that.
        assert len(self.callback_calls) == 2

        # Ensure that the first message had a 'badge_id' in the message.
        assert 'badge_id' in self.callback_calls[0][1]['msg']['badge']

    def test_get_badges_from_tags(self):
        issuer_id = self.api.add_issuer("TestOrigin", "TestName", "TestOrg",
                                        "TestContact")

        # Badge tagged with "test"
        self.api.add_badge("TestBadgeA",
                           "TestImage",
                           "A test badge for doing unit tests",
                           "TestCriteria",
                           issuer_id,
                           tags="test")

        # Badge tagged with "tester"
        self.api.add_badge("TestBadgeB",
                           "TestImage",
                           "A second test badge for doing unit tests",
                           "TestCriteria",
                           issuer_id,
                           tags="tester")

        # Badge tagged with both "test" and "tester"
        self.api.add_badge("TestBadgeC",
                           "TestImage",
                           "A third test badge for doing unit tests",
                           "TestCriteria",
                           issuer_id,
                           tags="test, tester")

        tags = ['test', 'tester']
        badges_any = self.api.get_badges_from_tags(tags, match_all=False)
        assert len(badges_any) == 3
        badges_all = self.api.get_badges_from_tags(tags, match_all=True)
        assert len(badges_all) == 1

    def tearDown(self):
        check_output(['rm', 'testdb.db'])
        self.callback_calls = []
예제 #9
0
class TestRanking(object):
    def setUp(self):
        check_output(['touch', 'testdb.db'])
        sqlalchemy_uri = "sqlite:///testdb.db"
        engine = create_engine(sqlalchemy_uri)
        DBSession.configure(bind=engine)
        DeclarativeBase.metadata.create_all(engine)

        self.api = TahrirDatabase(sqlalchemy_uri)
        self._create_test_data()

    def tearDown(self):
        check_output(['rm', 'testdb.db'])

    def _create_test_data(self):
        issuer_id = self.api.add_issuer("TestOrigin", "TestName", "TestOrg",
                                        "TestContact")
        self.badge_id_1 = self.api.add_badge(
            "TestBadge1",
            "TestImage",
            "A test badge for doing unit tests",
            "TestCriteria",
            issuer_id,
        )
        self.badge_id_2 = self.api.add_badge(
            "TestBadge2",
            "TestImage",
            "A test badge for doing unit tests",
            "TestCriteria",
            issuer_id,
        )
        self.badge_id_3 = self.api.add_badge(
            "TestBadge3",
            "TestImage",
            "A test badge for doing unit tests",
            "TestCriteria",
            issuer_id,
        )
        self.email_1 = "*****@*****.**"
        person_id_1 = self.api.add_person(self.email_1)
        self.email_2 = "*****@*****.**"
        person_id_2 = self.api.add_person(self.email_2)
        self.email_3 = "*****@*****.**"
        person_id_3 = self.api.add_person(self.email_3)
        self.email_4 = "*****@*****.**"
        person_id_4 = self.api.add_person(self.email_4)

    def test_ranking_simple(self):
        self.api.add_assertion(self.badge_id_1, self.email_1, None)

        self.api.add_assertion(self.badge_id_1, self.email_4, None)
        self.api.add_assertion(self.badge_id_2, self.email_4, None)
        self.api.add_assertion(self.badge_id_3, self.email_4, None)

        person1 = self.api.get_person("*****@*****.**")
        person4 = self.api.get_person("*****@*****.**")

        eq_(person1.rank, 2)
        eq_(person4.rank, 1)

    def test_ranking_tie(self):
        self.api.add_assertion(self.badge_id_1, self.email_1, None)

        self.api.add_assertion(self.badge_id_1, self.email_2, None)
        self.api.add_assertion(self.badge_id_2, self.email_2, None)

        self.api.add_assertion(self.badge_id_1, self.email_3, None)
        self.api.add_assertion(self.badge_id_2, self.email_3, None)

        self.api.add_assertion(self.badge_id_1, self.email_4, None)
        self.api.add_assertion(self.badge_id_2, self.email_4, None)
        self.api.add_assertion(self.badge_id_3, self.email_4, None)

        person1 = self.api.get_person("*****@*****.**")
        person2 = self.api.get_person("*****@*****.**")
        person3 = self.api.get_person("*****@*****.**")
        person4 = self.api.get_person("*****@*****.**")

        eq_(person1.rank, 4)
        eq_(person2.rank, 2)
        eq_(person3.rank, 2)
        eq_(person4.rank, 1)

    def test_ranking_preexisting(self):
        """ Test that rank updating works for pre-existant users """
        person1 = self.api.get_person("*****@*****.**")
        new_assertion1 = Assertion(
            badge_id=self.badge_id_1,
            person_id=person1.id,
        )
        self.api.session.add(new_assertion1)
        new_assertion2 = Assertion(
            badge_id=self.badge_id_2,
            person_id=person1.id,
        )
        self.api.session.add(new_assertion2)
        self.api.session.flush()

        # For persons who existed *before* we added cached ranks, they should
        # have a null-rank.
        eq_(person1.rank, None)

        # But once *anyone* else gets a badge, old ranks should be updated too.
        self.api.add_assertion(self.badge_id_1, self.email_2, None)
        eq_(person1.rank, 1)

        person2 = self.api.get_person("*****@*****.**")
        eq_(person2.rank, 2)

        # but people with no badges should still be null ranked.
        person3 = self.api.get_person("*****@*****.**")
        eq_(person3.rank, None)

    def test_ranking_with_time_limits(self):
        self.api.add_assertion(self.badge_id_1, self.email_1, yesterday)

        self.api.add_assertion(self.badge_id_1, self.email_4, yesterday)
        self.api.add_assertion(self.badge_id_2, self.email_4, one_week_ago)
        self.api.add_assertion(self.badge_id_3, self.email_4, one_month_ago)

        person1 = self.api.get_person("*****@*****.**")
        person4 = self.api.get_person("*****@*****.**")

        epsilon = datetime.timedelta(hours=1)

        results = self.api._make_leaderboard(yesterday - epsilon, now)
        eq_(results[person1]['badges'], 1)
        eq_(results[person4]['badges'], 1)

        results = self.api._make_leaderboard(one_week_ago - epsilon, now)
        eq_(results[person1]['badges'], 1)
        eq_(results[person4]['badges'], 2)

        results = self.api._make_leaderboard(one_month_ago - epsilon, now)
        eq_(results[person1]['badges'], 1)
        eq_(results[person4]['badges'], 3)
예제 #10
0
class TestDBInit(object):

    def setUp(self):
        check_output(['touch', 'testdb.db'])
        sqlalchemy_uri = "sqlite:///testdb.db"
        engine = create_engine(sqlalchemy_uri)
        DBSession.configure(bind=engine)
        DeclarativeBase.metadata.create_all(engine)

        self.api = TahrirDatabase(sqlalchemy_uri)

    def test_add_badges(self):
        self.api.add_badge(
            "TestBadge",
            "TestImage",
            "A test badge for doing unit tests",
            "TestCriteria",
            1337
        )

        assert self.api.badge_exists("testbadge") is True

    def test_add_person(self):
        self.api.add_person("*****@*****.**")
        assert self.api.person_exists("*****@*****.**") is True

    def test_add_issuer(self):
        _id = self.api.add_issuer(
            "TestOrigin",
            "TestName",
            "TestOrg",
            "TestContact"
        )
        assert self.api.issuer_exists("TestOrigin", "TestName") is True

    def test_add_invitation(self):
        badge_id = self.api.add_badge(
            "TestBadge",
            "TestImage",
            "A test badge for doing unit tests",
            "TestCriteria",
            1337
        )
        _id = self.api.add_invitation(
            badge_id,
        )

        assert self.api.invitation_exists(_id)

    def test_last_login(self):
        email = "*****@*****.**"
        person_id = self.api.add_person(email)
        person = self.api.get_person(person_id)
        assert not person.last_login
        self.api.note_login(nickname=person.nickname)
        assert person.last_login

    def test_add_assertion(self):
        issuer_id = self.api.add_issuer(
            "TestOrigin",
            "TestName",
            "TestOrg",
            "TestContact"
        )
        badge_id = self.api.add_badge(
            "TestBadge",
            "TestImage",
            "A test badge for doing unit tests",
            "TestCriteria",
            issuer_id,
        )
        email = "*****@*****.**"
        person_id = self.api.add_person(email)
        assertion_id = self.api.add_assertion(badge_id, email, None)
        assert self.api.assertion_exists(badge_id, email)

    def test_get_badges_from_tags(self):
        issuer_id = self.api.add_issuer(
            "TestOrigin",
            "TestName",
            "TestOrg",
            "TestContact"
        )

        # Badge tagged with "test"
        self.api.add_badge(
            "TestBadgeA",
            "TestImage",
            "A test badge for doing unit tests",
            "TestCriteria",
            issuer_id,
            tags="test"
        )

        # Badge tagged with "tester"
        self.api.add_badge(
            "TestBadgeB",
            "TestImage",
            "A second test badge for doing unit tests",
            "TestCriteria",
            issuer_id,
            tags="tester"
        )

        # Badge tagged with both "test" and "tester"
        self.api.add_badge(
            "TestBadgeC",
            "TestImage",
            "A third test badge for doing unit tests",
            "TestCriteria",
            issuer_id,
            tags="test, tester"
        )

        tags = ['test', 'tester']
        badges_any = self.api.get_badges_from_tags(tags, match_all=False)
        assert len(badges_any) == 3
        badges_all = self.api.get_badges_from_tags(tags, match_all=True)
        assert len(badges_all) == 1

    def tearDown(self):
        check_output(['rm', 'testdb.db'])