168 lines
4.8 KiB
JavaScript
168 lines
4.8 KiB
JavaScript
const DATA_PDF = atob(
|
|
"JVBERi0xLjANCjEgMCBvYmo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFI+PmVuZG9iaiAyIDAgb2JqPDwvVHlwZS9QYWdlcy9LaWRzWzMgMCBSXS9Db3VudCAxPj5lbmRvYmogMyAwIG9iajw8L1R5cGUvUGFnZS9NZWRpYUJveFswIDAgMyAzXT4+ZW5kb2JqDQp4cmVmDQowIDQNCjAwMDAwMDAwMDAgNjU1MzUgZg0KMDAwMDAwMDAxMCAwMDAwMCBuDQowMDAwMDAwMDUzIDAwMDAwIG4NCjAwMDAwMDAxMDIgMDAwMDAgbg0KdHJhaWxlcjw8L1NpemUgNC9Sb290IDEgMCBSPj4NCnN0YXJ0eHJlZg0KMTQ5DQolRU9G"
|
|
);
|
|
|
|
const DOWNLOAD_TEMPLATE = {
|
|
source: {
|
|
url: "https://example.com/download",
|
|
},
|
|
target: {
|
|
path: "",
|
|
},
|
|
contentType: "text/plain",
|
|
succeeded: DownloadsCommon.DOWNLOAD_FINISHED,
|
|
canceled: false,
|
|
error: null,
|
|
hasPartialData: false,
|
|
hasBlockedData: false,
|
|
startTime: new Date(Date.now() - 1000),
|
|
};
|
|
|
|
const TESTFILES = {
|
|
"download-test.txt": "Text file contents\n",
|
|
"download-test.pdf": DATA_PDF,
|
|
"download-test.PDF": DATA_PDF,
|
|
"download-test.xxunknown": "Unknown file contents\n",
|
|
"download-test": "No extension file contents\n",
|
|
};
|
|
let gPublicList;
|
|
|
|
add_task(async function test_setup() {
|
|
let profileDir = Services.dirsvc.get("ProfD", Ci.nsIFile).path;
|
|
Assert.ok(profileDir, "profileDir: " + profileDir);
|
|
for (let [filename, contents] of Object.entries(TESTFILES)) {
|
|
TESTFILES[filename] = await createDownloadedFile(
|
|
PathUtils.join(gDownloadDir, filename),
|
|
contents
|
|
);
|
|
}
|
|
gPublicList = await Downloads.getList(Downloads.PUBLIC);
|
|
});
|
|
|
|
const TESTCASES = [
|
|
{
|
|
name: "Check returned value is null when the download did not succeed",
|
|
testFile: "download-test.txt",
|
|
contentType: "text/plain",
|
|
succeeded: false,
|
|
expected: null,
|
|
},
|
|
{
|
|
name: "Check correct mime-info is returned when download contentType is unambiguous",
|
|
testFile: "download-test.txt",
|
|
contentType: "text/plain",
|
|
expected: {
|
|
type: "text/plain",
|
|
},
|
|
},
|
|
{
|
|
name: "Returns correct mime-info from file extension when download contentType is missing",
|
|
testFile: "download-test.pdf",
|
|
contentType: undefined,
|
|
expected: {
|
|
type: "application/pdf",
|
|
},
|
|
},
|
|
{
|
|
name: "Returns correct mime-info from file extension case-insensitively",
|
|
testFile: "download-test.PDF",
|
|
contentType: undefined,
|
|
expected: {
|
|
type: "application/pdf",
|
|
},
|
|
},
|
|
{
|
|
name: "Returns null when contentType is missing and file extension is unknown",
|
|
testFile: "download-test.xxunknown",
|
|
contentType: undefined,
|
|
expected: null,
|
|
},
|
|
{
|
|
name: "Returns contentType when contentType is ambiguous and file extension is unknown",
|
|
testFile: "download-test.xxunknown",
|
|
contentType: "application/octet-stream",
|
|
expected: {
|
|
type: "application/octet-stream",
|
|
},
|
|
},
|
|
{
|
|
name: "Returns contentType when contentType is ambiguous and there is no file extension",
|
|
testFile: "download-test",
|
|
contentType: "application/octet-stream",
|
|
expected: {
|
|
type: "application/octet-stream",
|
|
},
|
|
},
|
|
{
|
|
name: "Returns null when there's no contentType and no file extension",
|
|
testFile: "download-test",
|
|
contentType: undefined,
|
|
expected: null,
|
|
},
|
|
];
|
|
|
|
// add tests for each of the generic mime-types we recognize,
|
|
// to ensure they prefer the associated mime-type of the target file extension
|
|
for (let type of [
|
|
"application/octet-stream",
|
|
"binary/octet-stream",
|
|
"application/unknown",
|
|
]) {
|
|
TESTCASES.push({
|
|
name: `Returns correct mime-info from file extension when contentType is generic (${type})`,
|
|
testFile: "download-test.pdf",
|
|
contentType: type,
|
|
expected: {
|
|
type: "application/pdf",
|
|
},
|
|
});
|
|
}
|
|
|
|
for (let testData of TESTCASES) {
|
|
let tmp = {
|
|
async [testData.name]() {
|
|
info("testing with: " + JSON.stringify(testData));
|
|
await test_getMimeInfo_basic_function(testData);
|
|
},
|
|
};
|
|
add_task(tmp[testData.name]);
|
|
}
|
|
|
|
/**
|
|
* Sanity test the DownloadsCommon.getMimeInfo method with test parameters
|
|
*/
|
|
async function test_getMimeInfo_basic_function(testData) {
|
|
let downloadData = {
|
|
...DOWNLOAD_TEMPLATE,
|
|
source: "source" in testData ? testData.source : DOWNLOAD_TEMPLATE.source,
|
|
succeeded:
|
|
"succeeded" in testData
|
|
? testData.succeeded
|
|
: DOWNLOAD_TEMPLATE.succeeded,
|
|
target: TESTFILES[testData.testFile],
|
|
contentType: testData.contentType,
|
|
};
|
|
Assert.ok(downloadData.target instanceof Ci.nsIFile, "target is a nsIFile");
|
|
let download = await Downloads.createDownload(downloadData);
|
|
await gPublicList.add(download);
|
|
await download.refresh();
|
|
|
|
Assert.ok(
|
|
await IOUtils.exists(download.target.path),
|
|
"The file should actually exist."
|
|
);
|
|
let result = await DownloadsCommon.getMimeInfo(download);
|
|
if (testData.expected) {
|
|
Assert.equal(
|
|
result.type,
|
|
testData.expected.type,
|
|
"Got expected mimeInfo.type"
|
|
);
|
|
} else {
|
|
Assert.equal(
|
|
result,
|
|
null,
|
|
`Expected null, got object with type: ${result?.type}`
|
|
);
|
|
}
|
|
}
|