require '../common' # Doesn't work on Travis. Need to figure out why, probably by having the # url not depend on some external resource. mongoose = require 'mongoose' request = require '../request' xdescribe '/file', -> url = getURL('/file') files = [] options = { uri: url json: { # url: 'http://scotterickson.info/images/where-are-you.jpg' url: 'http://fc07.deviantart.net/fs37/f/2008/283/5/1/Chu_Chu_Pikachu_by_angelishi.gif' filename: 'where-are-you.jpg' mimetype: 'image/jpeg' description: 'None!' } } filepath = 'tmp/file' # TODO Warning hard coded path !!! jsonOptions= { path: 'my_path' postName: 'my_buffer' filename: 'ittybitty.data' mimetype: 'application/octet-stream' description: 'rando-info' # my_buffer_url: 'http://scotterickson.info/images/where-are-you.jpg' my_buffer_url: 'http://fc07.deviantart.net/fs37/f/2008/283/5/1/Chu_Chu_Pikachu_by_angelishi.gif' } allowHeader = 'GET, POST' it 'preparing test : deletes all the files first', (done) -> dropGridFS -> done() it 'can\'t be created if invalid (property path is required)', (done) -> func = (err, res, body) -> expect(res.statusCode).toBe(422) done() loginAdmin -> request.post(options, func) it 'can be created by an admin', (done) -> func = (err, res, body) -> expect(res.statusCode).toBe(200) expect(body._id).toBeDefined() expect(body.filename).toBe(options.json.filename) expect(body.contentType).toBe(options.json.mimetype) expect(body.length).toBeDefined() expect(body.uploadDate).toBeDefined() expect(body.metadata).toBeDefined() expect(body.metadata.name).toBeDefined() expect(body.metadata.path).toBe(options.json.path) expect(body.metadata.creator).toBeDefined() expect(body.metadata.description).toBe(options.json.description) expect(body.md5).toBeDefined() files.push(body) done() options.json.path = filepath request.post(options, func) it 'can be read by an admin.', (done) -> request.get {uri: url+'/'+files[0]._id}, (err, res) -> expect(res.statusCode).toBe(200) expect(res.headers['content-type']).toBe(files[0].contentType) done() it 'returns 404 for missing files', (done) -> id = '000000000000000000000000' request.get {uri: url+'/'+id}, (err, res) -> expect(res.statusCode).toBe(404) done() it 'returns 404 for invalid ids', (done) -> request.get {uri: url+'/thiswillnotwork'}, (err, res) -> expect(res.statusCode).toBe(404) done() it 'can be created directly with form parameters', (done) -> options2 = { uri: url } func = (err, res, body) -> expect(res.statusCode).toBe(200) body = JSON.parse(body) expect(body._id).toBeDefined() expect(body.filename).toBe(jsonOptions.filename) expect(body.contentType).toBe(jsonOptions.mimetype) expect(body.length).toBeDefined() expect(body.uploadDate).toBeDefined() expect(body.metadata).toBeDefined() expect(body.metadata.name).toBeDefined() expect(body.metadata.path).toBe(jsonOptions.path) expect(body.metadata.creator).toBeDefined() expect(body.metadata.description).toBe(jsonOptions.description) expect(body.md5).toBeDefined() files.push(body) done() # the only way I could figure out how to get request to do what I wanted... r = request.post(options2, func) form = r.form() form.append('path', jsonOptions.path) form.append('postName', jsonOptions.postName) form.append('filename', jsonOptions.filename) form.append('mimetype', jsonOptions.mimetype) form.append('description', jsonOptions.description) form.append('my_buffer', request(jsonOptions.my_buffer_url)) it 'created directly, can be read', (done) -> request.get {uri: url+'/'+files[1]._id}, (err, res) -> expect(res.statusCode).toBe(200) expect(res.headers['content-type']).toBe(files[1].contentType) done() it 'does not overwrite existing files', (done) -> options.json.description = 'Face' func = (err, res, body) -> expect(res.statusCode).toBe(409) collection = mongoose.connection.db.collection('media.files') collection.find({}).toArray (err, results) -> # ittybitty.data, and just one Where are you.jpg expect(results.length).toBe(2) for f in results expect(f.metadata.description).not.toBe('Face') done() request.post(options, func) it 'does overwrite existing files if force is true', (done) -> options.json.force = 'true' # TODO ask why it's a string and not a boolean ? func = (err, res, body) -> expect(res.statusCode).toBe(200) collection = mongoose.connection.db.collection('media.files') collection.find({}).toArray (err, results) -> # ittybitty.data, and just one Where are you.jpg expect(results.length).toBe(2) hit = false for f in results hit = true if f.metadata.description is 'Face' expect(hit).toBe(true) done() request.post(options, func) it ' can\'t be requested with HTTP PATCH method', (done) -> request {method: 'patch', uri: url}, (err, res) -> expect(res.statusCode).toBe(405) expect(res.headers.allow).toBe(allowHeader) done() it ' can\'t be requested with HTTP PUT method', (done) -> request.put {uri: url}, (err, res) -> expect(res.statusCode).toBe(405) expect(res.headers.allow).toBe(allowHeader) done() it ' can\'t be requested with HTTP HEAD method', (done) -> request.head {uri: url}, (err, res) -> expect(res.statusCode).toBe(405) expect(res.headers.allow).toBe(allowHeader) done() it ' can\'t be requested with HTTP DEL method', (done) -> request.del {uri: url}, (err, res) -> expect(res.statusCode).toBe(405) expect(res.headers.allow).toBe(allowHeader) done() # TODO: test server errors, see what they do