Skip to content
This repository has been archived by the owner on Jan 14, 2020. It is now read-only.

Commit

Permalink
Merge branch 'master' of github.com:mozilla/clopenbadger
Browse files Browse the repository at this point in the history
  • Loading branch information
brianloveswords committed Oct 15, 2012
2 parents abff9ad + c7799e3 commit 9644c12
Show file tree
Hide file tree
Showing 10 changed files with 285 additions and 85 deletions.
99 changes: 99 additions & 0 deletions consumer/clopenbadger.js
@@ -0,0 +1,99 @@
"use strict";

define(["jquery", "backbone-events"], function($, BackboneEvents) {
function countUnreadBadges(earned) {
var unread = 0;
Object.keys(earned).forEach(function(shortname) {
if (!earned[shortname].isRead)
unread++;
});
return unread;
}

function updateunreadBadgeCount(badger) {
var unreadBadgeCount = countUnreadBadges(badger.earnedBadges);
if (unreadBadgeCount !== badger.unreadBadgeCount) {
badger.unreadBadgeCount = unreadBadgeCount;
badger.trigger("change:unreadBadgeCount");
}
}

return function Clopenbadger(options) {
var server = options.server;
var token = options.token;
var email = options.email;
var self = {
availableBadges: undefined,
earnedBadges: undefined,
unreadBadgeCount: undefined,
markAllBadgesAsRead: function() {
if (self.unreadBadgeCount == 0)
return;
$.ajax({
type: 'POST',
url: server + '/v1/user/mark-all-badges-as-read',
dataType: 'json',
data: {
auth: token,
email: email
},
success: function(data) {
// TODO: Check for errors.
if (data.status == "ok") {
Object.keys(self.earnedBadges).forEach(function(shortname) {
self.earnedBadges[shortname].isRead = true;
});
updateunreadBadgeCount(self);
self.trigger("change:earnedBadges");
}
}
});
},
credit: function(shortname) {
// TODO: Should we wait for available/earned badges to be registered
// before sending this?
$.ajax({
type: 'POST',
url: server + '/v1/user/behavior/' + shortname + '/credit',
dataType: 'json',
data: {
auth: token,
email: email
},
success: function(data) {
// TODO: Check for errors.
if (data.status == "awarded") {
$.extend(self.earnedBadges, data.badges);
updateunreadBadgeCount(self);
self.trigger("change:earnedBadges");
self.trigger("award", Object.keys(data.badges));
}
}
});
}
};

BackboneEvents.mixin(self);

var availableReq = $.getJSON(server + '/v1/badges', function(data) {
// TODO: Check for errors.
self.availableBadges = data.badges;
});

var earnedReq = $.getJSON(server + '/v1/user', {
auth: token,
email: email
}, function(data) {
// TODO: Check for errors.
self.earnedBadges = data.badges;
});

$.when(availableReq, earnedReq).done(function() {
updateunreadBadgeCount(self);
self.trigger("change:availableBadges");
self.trigger("change:earnedBadges");
});

return self;
};
});
32 changes: 0 additions & 32 deletions consumer/js/clopenbadger.js

This file was deleted.

28 changes: 0 additions & 28 deletions consumer/js/require-config.js

This file was deleted.

70 changes: 66 additions & 4 deletions consumer/test/all-tests.js
Expand Up @@ -14,7 +14,7 @@ defineTests([
"criteria": "Can log into a site that uses Persona for auth.",
"image": "https://wiki.mozilla.org/images/b/bb/Merit-badge.png",
"behavior": "LOGGED_IN",
"score": "1",
"score": 1,
"prerequisites": []
}
};
Expand All @@ -23,7 +23,8 @@ defineTests([
setup: function() {
Server.setup({
urlPrefix: fakeServerURL,
availableBadges: availableBadges
availableBadges: availableBadges,
time: 12345
});
badger = Clopenbadger({
server: fakeServerURL,
Expand All @@ -32,20 +33,81 @@ defineTests([
});
}
});

asyncTest("change:unreadBadgeCount is broadcast on init", function() {
badger.on('change:unreadBadgeCount', function() {
equal(badger.unreadBadgeCount, 0,
"badger.unreadBadgeCount matches our expectations");
start();
});
});

asyncTest("change:availableBadges is broadcast", function() {
asyncTest("change:availableBadges is broadcast on init", function() {
badger.on('change:availableBadges', function() {
deepEqual(badger.availableBadges, availableBadges,
"badger.availableBadges matches our expectations");
start();
});
});

asyncTest("change:earnedBadges is broadcast", function() {
asyncTest("change:earnedBadges is broadcast on init", function() {
var available = false;
badger.on('change:availableBadges', function() { available = true; });
badger.on('change:earnedBadges', function() {
ok(available, "change:availableBadges is always triggered first");
deepEqual(badger.earnedBadges, {},
"badger.earnedBadges matches our expectations");
start();
});
});

asyncTest("markAllBadgesAsRead() changes unreadBadgeCount", function() {
var unread = false;
Server.flushResponses();
badger.on('award', function(badges) {
equal(badger.unreadBadgeCount, 1, "unreadBadgeCount is 1");
badger.on('change:unreadBadgeCount', function() {
unread = true;
equal(badger.unreadBadgeCount, 0, "unreadBadgeCount is cleared");
});
badger.on('change:earnedBadges', function() {
ok(unread,
"change:unreadBadgeCount triggered before changed:earnedBadges");
start();
});
badger.markAllBadgesAsRead();
});
badger.credit('LOGGED_IN');
});

asyncTest("award is broadcast", function() {
var earned = false;
var unread = false;
Server.flushResponses();
ok(!("FIRST_LOGIN" in badger.earnedBadges),
"badger.earnedBadges does not contain the FIRST_LOGIN badge");
badger.on('change:unreadBadgeCount', function() {
unread = true;
equal(badger.unreadBadgeCount, 1, "badger.unreadBadgeCount is 1");
});
badger.on('change:earnedBadges', function() {
ok(unread,
"change:unreadBadgeCount triggered before changed:earnedBadges");
ok("FIRST_LOGIN" in badger.earnedBadges,
"badger.earnedBadges contains the FIRST_LOGIN badge");
earned = true;
});
badger.on('award', function(badges) {
ok(earned, "changed:earnedBadges triggered before award");
deepEqual(badges, ["FIRST_LOGIN"], "event param has earned badges");
equal(Server.behaviors.LOGGED_IN, 1, "LOGGED_IN behavior credited");
deepEqual(badger.earnedBadges["FIRST_LOGIN"], {
issuedOn: 12345,
assertionUrl: "http://clopenbadger/foo@bar.org/FIRST_LOGIN",
isRead: false
}, "badger.earnedBadges['FIRST_LOGIN'] matches expectations");
start();
});
badger.credit('LOGGED_IN');
});
});

0 comments on commit 9644c12

Please sign in to comment.