194 lines
5.7 KiB
TypeScript
194 lines
5.7 KiB
TypeScript
import fs from 'fs';
|
|
import path from 'path';
|
|
import FormData from 'form-data';
|
|
import { promisify } from 'util';
|
|
import { initPayloadTest } from '../helpers/configHelpers';
|
|
import { RESTClient } from '../helpers/rest';
|
|
import config, { mediaSlug, relationSlug } from './config';
|
|
import payload from '../../src';
|
|
import getFileByPath from '../../src/uploads/getFileByPath';
|
|
|
|
const stat = promisify(fs.stat);
|
|
|
|
require('isomorphic-fetch');
|
|
|
|
let client;
|
|
|
|
describe('Collections - Uploads', () => {
|
|
beforeAll(async (done) => {
|
|
const { serverURL } = await initPayloadTest({ __dirname, init: { local: false } });
|
|
client = new RESTClient(config, { serverURL, defaultSlug: mediaSlug });
|
|
await client.login();
|
|
|
|
done();
|
|
});
|
|
|
|
describe('REST', () => {
|
|
describe('create', () => {
|
|
it('creates from form data', async () => {
|
|
const formData = new FormData();
|
|
formData.append('file', fs.createReadStream(path.join(__dirname, './image.png')));
|
|
|
|
const { status, doc } = await client.create({
|
|
file: true,
|
|
data: formData,
|
|
auth: true,
|
|
headers: {},
|
|
});
|
|
|
|
expect(status).toBe(201);
|
|
|
|
// Check for files
|
|
expect(await fileExists(path.join(__dirname, './media', doc.filename))).toBe(true);
|
|
expect(await fileExists(path.join(__dirname, './media', doc.sizes.maintainedAspectRatio.filename))).toBe(true);
|
|
expect(await fileExists(path.join(__dirname, './media', doc.sizes.tablet.filename))).toBe(true);
|
|
expect(await fileExists(path.join(__dirname, './media', doc.sizes.mobile.filename))).toBe(true);
|
|
expect(await fileExists(path.join(__dirname, './media', doc.sizes.icon.filename))).toBe(true);
|
|
|
|
// Check api response
|
|
expect(doc.mimeType).toEqual('image/png');
|
|
expect(doc.sizes.maintainedAspectRatio.url).toContain('/media/image');
|
|
expect(doc.sizes.maintainedAspectRatio.url).toContain('.png');
|
|
expect(doc.sizes.maintainedAspectRatio.width).toEqual(1024);
|
|
expect(doc.sizes.maintainedAspectRatio.height).toEqual(1024);
|
|
expect(doc.sizes).toHaveProperty('tablet');
|
|
expect(doc.sizes).toHaveProperty('mobile');
|
|
expect(doc.sizes).toHaveProperty('icon');
|
|
});
|
|
});
|
|
|
|
it('creates images that do not require all sizes', async () => {
|
|
const formData = new FormData();
|
|
formData.append('file', fs.createReadStream(path.join(__dirname, './small.png')));
|
|
|
|
const { status, doc } = await client.create({
|
|
file: true,
|
|
data: formData,
|
|
auth: true,
|
|
headers: {},
|
|
});
|
|
|
|
expect(status).toBe(201);
|
|
|
|
// Check for files
|
|
expect(await fileExists(path.join(__dirname, './media', doc.filename))).toBe(true);
|
|
expect(await fileExists(path.join(__dirname, './media', 'small-640x480.png'))).toBe(false);
|
|
expect(await fileExists(path.join(__dirname, './media', doc.sizes.icon.filename))).toBe(true);
|
|
|
|
// Check api response
|
|
expect(doc.sizes.tablet.filename).toBeUndefined();
|
|
expect(doc.sizes.icon.filename).toBeDefined();
|
|
});
|
|
|
|
it('creates media without storing a file', async () => {
|
|
const formData = new FormData();
|
|
formData.append('file', fs.createReadStream(path.join(__dirname, './small.png')));
|
|
|
|
// unstored media
|
|
const { status, doc } = await client.create({
|
|
slug: 'unstored-media',
|
|
file: true,
|
|
data: formData,
|
|
auth: true,
|
|
headers: {},
|
|
});
|
|
|
|
expect(status).toBe(201);
|
|
|
|
// Check for files
|
|
expect(await !fileExists(path.join(__dirname, './media', doc.filename))).toBe(false);
|
|
|
|
// Check api response
|
|
expect(doc.filename).toBeDefined();
|
|
});
|
|
});
|
|
|
|
it('update', async () => {
|
|
// Create image
|
|
const filePath = path.resolve(__dirname, './image.png');
|
|
const file = getFileByPath(filePath);
|
|
file.name = 'renamed.png';
|
|
|
|
const mediaDoc = await payload.create({
|
|
collection: mediaSlug,
|
|
data: {},
|
|
file,
|
|
});
|
|
|
|
const formData = new FormData();
|
|
formData.append('file', fs.createReadStream(path.join(__dirname, './small.png')));
|
|
|
|
const { status, doc } = await client.update({
|
|
id: mediaDoc.id,
|
|
file: true,
|
|
data: formData,
|
|
auth: true,
|
|
headers: {},
|
|
});
|
|
|
|
expect(status).toBe(200);
|
|
|
|
// Check that previously existing files weren't affected
|
|
expect(await fileExists(path.join(__dirname, './media', mediaDoc.filename))).toBe(true);
|
|
expect(await fileExists(path.join(__dirname, './media', mediaDoc.sizes.icon.filename))).toBe(true);
|
|
});
|
|
|
|
it('should allow update removing a relationship', async () => {
|
|
const filePath = path.resolve(__dirname, './image.png');
|
|
const file = getFileByPath(filePath);
|
|
file.name = 'renamed.png';
|
|
|
|
const { id } = await payload.create({
|
|
collection: mediaSlug,
|
|
data: {},
|
|
file,
|
|
});
|
|
|
|
const related = await payload.create({
|
|
collection: relationSlug,
|
|
data: {
|
|
image: id,
|
|
},
|
|
});
|
|
|
|
const doc = await payload.update({
|
|
collection: relationSlug,
|
|
id: related.id,
|
|
data: {
|
|
image: null,
|
|
},
|
|
});
|
|
|
|
expect(doc.image).toBeNull();
|
|
});
|
|
|
|
it('delete', async () => {
|
|
const formData = new FormData();
|
|
formData.append('file', fs.createReadStream(path.join(__dirname, './image.png')));
|
|
|
|
const { doc } = await client.create({
|
|
file: true,
|
|
data: formData,
|
|
auth: true,
|
|
headers: {},
|
|
});
|
|
|
|
const { status } = await client.delete(doc.id, {
|
|
auth: true,
|
|
});
|
|
|
|
expect(status).toBe(200);
|
|
|
|
expect(await fileExists(path.join(__dirname, doc.filename))).toBe(false);
|
|
});
|
|
});
|
|
|
|
async function fileExists(fileName: string): Promise<boolean> {
|
|
try {
|
|
await stat(fileName);
|
|
return true;
|
|
} catch (err) {
|
|
return false;
|
|
}
|
|
}
|