PLT-3105 Files table migration (#4068)
* Implemented initial changes for files table * Removed *_benchmark_test.go files * Re-implemented GetPublicFile and added support for old path * Localization for files table * Moved file system code into utils package * Finished server-side changes and added initial upgrade script * Added getPostFiles api * Re-add Extension and HasPreviewImage fields to FileInfo * Removed unused translation * Fixed merge conflicts left over after permissions changes * Forced FileInfo.extension to be lower case * Changed FileUploadResponse to contain the FileInfos instead of FileIds * Fixed permissions on getFile* calls * Fixed notifications for file uploads * Added initial version of client code for files changes * Permanently added FileIds field to Post object and removed Post.HasFiles * Updated PostStore.Update to be usable in more circumstances * Re-added Filenames field and switched file migration to be entirely lazy-loaded * Increased max listener count for FileStore * Removed unused fileInfoCache * Moved file system code back into api * Removed duplicate test case * Fixed unit test running on ports other than 8065 * Renamed HasPermissionToPostContext to HasPermissionToChannelByPostContext * Refactored handleImages to make it more easily understandable * Renamed getPostFiles to getFileInfosForPost * Re-added pre-FileIds posts to analytics * Changed files to be saved as their ids as opposed to id/filename.ext * Renamed FileInfo.UserId to FileInfo.CreatorId * Fixed detection of language in CodePreview * Fixed switching between threads in the RHS not loading new files * Add serverside protection against a rare bug where the client sends the same file twice for a single post * Refactored the important parts of uploadFile api call into a function that can be called without a web context
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
a2deeed597
Коммит
8a0e649f98
248
webapp/tests/client_file.test.jsx
Обычный файл
248
webapp/tests/client_file.test.jsx
Обычный файл
@@ -0,0 +1,248 @@
|
||||
// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
|
||||
// See License.txt for license information.
|
||||
|
||||
import assert from 'assert';
|
||||
import TestHelper from './test_helper.jsx';
|
||||
|
||||
const fs = require('fs');
|
||||
|
||||
describe('Client.File', function() {
|
||||
this.timeout(100000);
|
||||
|
||||
before(function() {
|
||||
// write a temporary file so that we have something to upload for testing
|
||||
const buffer = new Buffer('R0lGODlhAQABAIABAP///wAAACwAAAAAAQABAAACAkQBADs=', 'base64');
|
||||
|
||||
const testGif = fs.openSync('test.gif', 'w+');
|
||||
fs.writeFileSync(testGif, buffer);
|
||||
});
|
||||
|
||||
after(function() {
|
||||
fs.unlinkSync('test.gif');
|
||||
});
|
||||
|
||||
it('uploadFile', function(done) {
|
||||
TestHelper.initBasic(() => {
|
||||
const clientId = TestHelper.generateId();
|
||||
|
||||
TestHelper.basicClient().uploadFile(
|
||||
fs.createReadStream('test.gif'),
|
||||
'test.gif',
|
||||
TestHelper.basicChannel().id,
|
||||
clientId,
|
||||
function(resp) {
|
||||
assert.equal(resp.file_infos.length, 1);
|
||||
assert.equal(resp.client_ids.length, 1);
|
||||
assert.equal(resp.client_ids[0], clientId);
|
||||
|
||||
done();
|
||||
},
|
||||
function(err) {
|
||||
done(new Error(err.message));
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('getFile', function(done) {
|
||||
TestHelper.initBasic(() => {
|
||||
TestHelper.basicClient().uploadFile(
|
||||
fs.createReadStream('test.gif'),
|
||||
'test.gif',
|
||||
TestHelper.basicChannel().id,
|
||||
'',
|
||||
function(resp) {
|
||||
TestHelper.basicClient().getFile(
|
||||
resp.file_infos[0].id,
|
||||
function() {
|
||||
done();
|
||||
},
|
||||
function(err2) {
|
||||
done(new Error(err2.message));
|
||||
}
|
||||
);
|
||||
},
|
||||
function(err) {
|
||||
done(new Error(err.message));
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('getFileThumbnail', function(done) {
|
||||
TestHelper.initBasic(() => {
|
||||
TestHelper.basicClient().uploadFile(
|
||||
fs.createReadStream('test.gif'),
|
||||
'test.gif',
|
||||
TestHelper.basicChannel().id,
|
||||
'',
|
||||
function(resp) {
|
||||
TestHelper.basicClient().getFileThumbnail(
|
||||
resp.file_infos[0].id,
|
||||
function() {
|
||||
done();
|
||||
},
|
||||
function(err) {
|
||||
done(new Error(err.message));
|
||||
}
|
||||
);
|
||||
},
|
||||
function(err) {
|
||||
done(new Error(err.message));
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('getFilePreview', function(done) {
|
||||
TestHelper.initBasic(() => {
|
||||
TestHelper.basicClient().uploadFile(
|
||||
fs.createReadStream('test.gif'),
|
||||
'test.gif',
|
||||
TestHelper.basicChannel().id,
|
||||
'',
|
||||
function(resp) {
|
||||
TestHelper.basicClient().getFilePreview(
|
||||
resp.file_infos[0].id,
|
||||
function() {
|
||||
done();
|
||||
},
|
||||
function(err2) {
|
||||
done(new Error(err2.message));
|
||||
}
|
||||
);
|
||||
},
|
||||
function(err) {
|
||||
done(new Error(err.message));
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('getFileInfo', function(done) {
|
||||
TestHelper.initBasic(() => {
|
||||
TestHelper.basicClient().uploadFile(
|
||||
fs.createReadStream('test.gif'),
|
||||
'test.gif',
|
||||
TestHelper.basicChannel().id,
|
||||
'',
|
||||
function(resp) {
|
||||
const fileId = resp.file_infos[0].id;
|
||||
|
||||
TestHelper.basicClient().getFileInfo(
|
||||
fileId,
|
||||
function(info) {
|
||||
assert.equal(info.id, fileId);
|
||||
assert.equal(info.name, 'test.gif');
|
||||
|
||||
done();
|
||||
},
|
||||
function(err2) {
|
||||
done(new Error(err2.message));
|
||||
}
|
||||
);
|
||||
},
|
||||
function(err) {
|
||||
done(new Error(err.message));
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('getPublicLink', function(done) {
|
||||
TestHelper.initBasic(() => {
|
||||
TestHelper.basicClient().uploadFile(
|
||||
fs.createReadStream('test.gif'),
|
||||
'test.gif',
|
||||
TestHelper.basicChannel().id,
|
||||
'',
|
||||
function(resp) {
|
||||
const post = TestHelper.fakePost();
|
||||
post.channel_id = TestHelper.basicChannel().id;
|
||||
post.file_ids = resp.file_infos.map((info) => info.id);
|
||||
|
||||
TestHelper.basicClient().createPost(
|
||||
post,
|
||||
function(data) {
|
||||
assert.deepEqual(data.file_ids, post.file_ids);
|
||||
|
||||
TestHelper.basicClient().getPublicLink(
|
||||
post.file_ids[0],
|
||||
function() {
|
||||
done(new Error('public links should be disabled by default'));
|
||||
|
||||
// request.
|
||||
// get(link).
|
||||
// end(TestHelper.basicChannel().handleResponse.bind(
|
||||
// this,
|
||||
// 'getPublicLink',
|
||||
// function() {
|
||||
// done();
|
||||
// },
|
||||
// function(err4) {
|
||||
// done(new Error(err4.message));
|
||||
// }
|
||||
// ));
|
||||
},
|
||||
function() {
|
||||
done();
|
||||
|
||||
// done(new Error(err3.message));
|
||||
}
|
||||
);
|
||||
},
|
||||
function(err2) {
|
||||
done(new Error(err2.message));
|
||||
}
|
||||
);
|
||||
},
|
||||
function(err) {
|
||||
done(new Error(err.message));
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('getFileInfosForPost', function(done) {
|
||||
TestHelper.initBasic(() => {
|
||||
TestHelper.basicClient().uploadFile(
|
||||
fs.createReadStream('test.gif'),
|
||||
'test.gif',
|
||||
TestHelper.basicChannel().id,
|
||||
'',
|
||||
function(resp) {
|
||||
const post = TestHelper.fakePost();
|
||||
post.channel_id = TestHelper.basicChannel().id;
|
||||
post.file_ids = resp.file_infos.map((info) => info.id);
|
||||
|
||||
TestHelper.basicClient().createPost(
|
||||
post,
|
||||
function(data) {
|
||||
assert.deepEqual(data.file_ids, post.file_ids);
|
||||
|
||||
TestHelper.basicClient().getFileInfosForPost(
|
||||
post.channel_id,
|
||||
data.id,
|
||||
function(files) {
|
||||
assert.equal(files.length, 1);
|
||||
assert.equal(files[0].id, resp.file_infos[0].id);
|
||||
|
||||
done();
|
||||
},
|
||||
function(err3) {
|
||||
done(new Error(err3.message));
|
||||
}
|
||||
);
|
||||
},
|
||||
function(err2) {
|
||||
done(new Error(err2.message));
|
||||
}
|
||||
);
|
||||
},
|
||||
function(err) {
|
||||
done(new Error(err.message));
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -43,43 +43,5 @@ describe('Client.General', function() {
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('File.getFileInfo', function(done) {
|
||||
TestHelper.initBasic(() => {
|
||||
TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
|
||||
|
||||
TestHelper.basicClient().getFileInfo(
|
||||
`/${TestHelper.basicChannel().id}/${TestHelper.basicUser().id}/filename.txt`,
|
||||
function(data) {
|
||||
assert.equal(data.filename, 'filename.txt');
|
||||
done();
|
||||
},
|
||||
function(err) {
|
||||
done(new Error(err.message));
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('File.getPublicLink', function(done) {
|
||||
TestHelper.initBasic(() => {
|
||||
TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
|
||||
var data = {};
|
||||
data.channel_id = TestHelper.basicChannel().id;
|
||||
data.user_id = TestHelper.basicUser().id;
|
||||
data.filename = `/${TestHelper.basicChannel().id}/${TestHelper.basicUser().id}/filename.txt`;
|
||||
|
||||
TestHelper.basicClient().getPublicLink(
|
||||
data,
|
||||
function() {
|
||||
done(new Error('not enabled'));
|
||||
},
|
||||
function(err) {
|
||||
assert.equal(err.id, 'api.file.get_public_link.disabled.app_error');
|
||||
done();
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -230,5 +230,7 @@ describe('Client.Posts', function() {
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
// getFileInfosForPost is tested in client_files.test.jsx
|
||||
});
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user