Commit ae5a369c by Will Daly

Simplify JavaScript file upload interface and clean up analytics events

parent c56853ae
...@@ -2,13 +2,12 @@ describe("OpenAssessment.FileUploader", function() { ...@@ -2,13 +2,12 @@ describe("OpenAssessment.FileUploader", function() {
var fileUploader = null; var fileUploader = null;
var TEST_URL = "http://www.example.com/upload"; var TEST_URL = "http://www.example.com/upload";
var TEST_IMAGE = { var TEST_FILE = {
data: "abcdefghijklmnopqrstuvwxyz", data: "abcdefghijklmnopqrstuvwxyz",
name: "test.jpg", name: "test.jpg",
size: 10471, size: 10471,
type: "image/jpeg" type: "image/jpeg"
}; };
var TEST_CONTENT_TYPE = "image/jpeg";
beforeEach(function() { beforeEach(function() {
fileUploader = new OpenAssessment.FileUploader(); fileUploader = new OpenAssessment.FileUploader();
...@@ -25,15 +24,24 @@ describe("OpenAssessment.FileUploader", function() { ...@@ -25,15 +24,24 @@ describe("OpenAssessment.FileUploader", function() {
spyOn(Logger, 'log'); spyOn(Logger, 'log');
// Upload a file // Upload a file
fileUploader.upload(TEST_URL, TEST_IMAGE, TEST_CONTENT_TYPE); fileUploader.upload(TEST_URL, TEST_FILE);
// Verify that a PUT request was sent with the right parameters
expect($.ajax).toHaveBeenCalledWith({
url: TEST_URL,
type: 'PUT',
data: TEST_FILE,
async: false,
processData: false,
contentType: 'image/jpeg'
});
// Verify that the event was logged // Verify that the event was logged
expect(Logger.log).toHaveBeenCalledWith( expect(Logger.log).toHaveBeenCalledWith(
"openassessment.upload_file", { "openassessment.upload_file", {
contentType: TEST_CONTENT_TYPE, fileName: TEST_FILE.name,
imageName: TEST_IMAGE.name, fileSize: TEST_FILE.size,
imageSize: TEST_IMAGE.size, fileType: TEST_FILE.type
imageType: TEST_IMAGE.type
} }
); );
}); });
......
...@@ -50,12 +50,11 @@ describe("OpenAssessment.ResponseView", function() { ...@@ -50,12 +50,11 @@ describe("OpenAssessment.ResponseView", function() {
this.uploadError = false; this.uploadError = false;
this.uploadArgs = null; this.uploadArgs = null;
this.upload = function(url, data, contentType) { this.upload = function(url, data) {
// Store the args we were passed so we can verify them // Store the args we were passed so we can verify them
this.uploadArgs = { this.uploadArgs = {
url: url, url: url,
data: data, data: data,
contentType: contentType
}; };
// Return a promise indicating success or error // Return a promise indicating success or error
...@@ -421,7 +420,6 @@ describe("OpenAssessment.ResponseView", function() { ...@@ -421,7 +420,6 @@ describe("OpenAssessment.ResponseView", function() {
view.fileUpload(); view.fileUpload();
expect(fileUploader.uploadArgs.url).toEqual(FAKE_URL); expect(fileUploader.uploadArgs.url).toEqual(FAKE_URL);
expect(fileUploader.uploadArgs.data).toEqual(files[0]); expect(fileUploader.uploadArgs.data).toEqual(files[0]);
expect(fileUploader.uploadArgs.contentType).toEqual('image/jpg');
}); });
it("displays an error if a one-time file upload URL cannot be retrieved", function() { it("displays an error if a one-time file upload URL cannot be retrieved", function() {
......
...@@ -8,38 +8,32 @@ PUT requests on the server. ...@@ -8,38 +8,32 @@ PUT requests on the server.
Args: Args:
url (string): The one-time URL we're uploading to. url (string): The one-time URL we're uploading to.
imageData (object): The object to upload, which should have properties: file (File): The HTML5 file reference.
data (string)
name (string)
size (int)
type (string)
contentType (string): The MIME type of the data to upload.
Returns: Returns:
JQuery promise JQuery promise
*/ */
OpenAssessment.FileUploader = function() { OpenAssessment.FileUploader = function() {
this.upload = function(url, imageData, contentType) { this.upload = function(url, file) {
return $.Deferred( return $.Deferred(
function(defer) { function(defer) {
$.ajax({ $.ajax({
url: url, url: url,
type: 'PUT', type: 'PUT',
data: imageData, data: file,
async: false, async: false,
processData: false, processData: false,
contentType: contentType, contentType: file.type,
}).done( }).done(
function(data, textStatus, jqXHR) { function(data, textStatus, jqXHR) {
// Log an analytics event // Log an analytics event
Logger.log( Logger.log(
"openassessment.upload_file", "openassessment.upload_file",
{ {
contentType: contentType, fileName: file.name,
imageName: imageData.name, fileSize: file.size,
imageSize: imageData.size, fileType: file.type
imageType: imageData.type
} }
); );
......
...@@ -466,7 +466,7 @@ OpenAssessment.ResponseView.prototype = { ...@@ -466,7 +466,7 @@ OpenAssessment.ResponseView.prototype = {
this.server.getUploadUrl(view.imageType).done( this.server.getUploadUrl(view.imageType).done(
function(url) { function(url) {
var image = view.files[0]; var image = view.files[0];
view.fileUploader.upload(url, image, view.imageType) view.fileUploader.upload(url, image)
.done(function() { .done(function() {
view.imageUrl(); view.imageUrl();
view.baseView.toggleActionError('upload', null); view.baseView.toggleActionError('upload', null);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment