Skip to content

Commit

Permalink
Merge pull request #501 from nextcloud/feat/file-folder-api
Browse files Browse the repository at this point in the history
  • Loading branch information
skjnldsv committed Oct 2, 2022
2 parents 3fcf2cf + e025fd7 commit 4dfd5c4
Show file tree
Hide file tree
Showing 12 changed files with 794 additions and 2 deletions.
95 changes: 95 additions & 0 deletions __tests__/files/file.spec.ts
@@ -0,0 +1,95 @@
import { File } from '../../lib/files/file'
import { FileType } from '../../lib/files/fileType'
import { Permission } from '../../lib/permissions'

describe('File creation', () => {
test('Valid dav file', () => {
const file = new File({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg',
mime: 'image/jpeg',
owner: 'emma'
})

expect(file).toBeInstanceOf(File)
expect(file.type).toBe(FileType.File)

// various data
expect(file.mime).toBe('image/jpeg')
expect(file.owner).toBe('emma')
expect(file.size).toBeUndefined()
expect(file.attributes).toStrictEqual({})

// path checks
expect(file.basename).toBe('picture.jpg')
expect(file.extension).toBe('.jpg')
expect(file.dirname).toBe('https://cloud.domain.com/remote.php/dav/files/emma/Photos')
expect(file.root).toBe('/files/emma/Photos')
expect(file.isDavRessource).toBe(true)
expect(file.permissions).toBe(Permission.READ)
})

test('Valid remote file', () => {
const file = new File({
source: 'https://domain.com/Photos/picture.jpg',
mime: 'image/jpeg',
owner: null
})

expect(file).toBeInstanceOf(File)
expect(file.type).toBe(FileType.File)

// various data
expect(file.mime).toBe('image/jpeg')
expect(file.owner).toBeNull()
expect(file.size).toBeUndefined()
expect(file.attributes).toStrictEqual({})

// path checks
expect(file.basename).toBe('picture.jpg')
expect(file.extension).toBe('.jpg')
expect(file.dirname).toBe('https://domain.com/Photos')
expect(file.root).toBeNull()
expect(file.isDavRessource).toBe(false)
expect(file.permissions).toBe(Permission.READ)
})
})

describe('File data change', () => {
test('Rename a file', () => {
const file = new File({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg',
mime: 'image/jpeg',
owner: 'emma'
})

expect(file.basename).toBe('picture.jpg')
expect(file.dirname).toBe('https://cloud.domain.com/remote.php/dav/files/emma/Photos')
expect(file.root).toBe('/files/emma/Photos')

file.rename('picture-old.jpg')

expect(file.basename).toBe('picture-old.jpg')
expect(file.dirname).toBe('https://cloud.domain.com/remote.php/dav/files/emma/Photos')
expect(file.source).toBe('https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture-old.jpg')
expect(file.root).toBe('/files/emma/Photos')
})

test('Changing source', () => {
const file = new File({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg',
mime: 'image/jpeg',
owner: 'emma'
})

expect(file.basename).toBe('picture.jpg')
expect(file.dirname).toBe('https://cloud.domain.com/remote.php/dav/files/emma/Photos')
expect(file.root).toBe('/files/emma/Photos')

file.move('https://cloud.domain.com/remote.php/dav/files/emma/Pictures/picture-old.jpg')

expect(file.basename).toBe('picture-old.jpg')
expect(file.dirname).toBe('https://cloud.domain.com/remote.php/dav/files/emma/Pictures')
expect(file.source).toBe('https://cloud.domain.com/remote.php/dav/files/emma/Pictures/picture-old.jpg')
expect(file.root).toBe('/files/emma/Pictures')
})
})
91 changes: 91 additions & 0 deletions __tests__/files/folder.spec.ts
@@ -0,0 +1,91 @@
import { Folder } from '../../lib/files/folder'
import { FileType } from '../../lib/files/fileType'
import { Permission } from '../../lib/permissions'

describe('File creation', () => {
test('Valid dav folder', () => {
const folder = new Folder({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos/',
owner: 'emma'
})

expect(folder).toBeInstanceOf(Folder)
expect(folder.type).toBe(FileType.Folder)

// various data
expect(folder.mime).toBe('httpd/unix-directory')
expect(folder.owner).toBe('emma')
expect(folder.size).toBeUndefined()
expect(folder.attributes).toStrictEqual({})

// path checks
expect(folder.basename).toBe('Photos')
expect(folder.extension).toBeNull()
expect(folder.dirname).toBe('https://cloud.domain.com/remote.php/dav/files/emma')
expect(folder.root).toBe('/files/emma')
expect(folder.isDavRessource).toBe(true)
expect(folder.permissions).toBe(Permission.READ)
})

test('Valid remote folder', () => {
const folder = new Folder({
source: 'https://domain.com/Photos/',
owner: null
})

expect(folder).toBeInstanceOf(Folder)
expect(folder.type).toBe(FileType.Folder)

// various data
expect(folder.mime).toBe('httpd/unix-directory')
expect(folder.owner).toBeNull()
expect(folder.size).toBeUndefined()
expect(folder.attributes).toStrictEqual({})

// path checks
expect(folder.basename).toBe('Photos')
expect(folder.extension).toBeNull()
expect(folder.dirname).toBe('https://domain.com')
expect(folder.root).toBeNull()
expect(folder.isDavRessource).toBe(false)
expect(folder.permissions).toBe(Permission.READ)
})
})

describe('Folder data change', () => {
test('Rename a folder', () => {
const folder = new Folder({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos',
owner: 'emma'
})

expect(folder.basename).toBe('Photos')
expect(folder.dirname).toBe('https://cloud.domain.com/remote.php/dav/files/emma')
expect(folder.root).toBe('/files/emma')

folder.rename('Pictures')

expect(folder.basename).toBe('Pictures')
expect(folder.dirname).toBe('https://cloud.domain.com/remote.php/dav/files/emma')
expect(folder.source).toBe('https://cloud.domain.com/remote.php/dav/files/emma/Pictures')
expect(folder.root).toBe('/files/emma')
})

test('Changing source', () => {
const folder = new Folder({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos/',
owner: 'emma'
})

expect(folder.basename).toBe('Photos')
expect(folder.dirname).toBe('https://cloud.domain.com/remote.php/dav/files/emma')
expect(folder.root).toBe('/files/emma')

folder.move('https://cloud.domain.com/remote.php/dav/files/emma/Pictures/')

expect(folder.basename).toBe('Pictures')
expect(folder.dirname).toBe('https://cloud.domain.com/remote.php/dav/files/emma')
expect(folder.source).toBe('https://cloud.domain.com/remote.php/dav/files/emma/Pictures')
expect(folder.root).toBe('/files/emma')
})
})
173 changes: 173 additions & 0 deletions __tests__/files/node.spec.ts
@@ -0,0 +1,173 @@
import { File } from '../../lib/files/file'
import { Folder } from '../../lib/files/folder'
import NodeData, { Attribute } from '../../lib/files/nodeData'

describe('Node testing', () => {
test('Root null fallback', () => {
const file = new File({
source: 'https://cloud.domain.com/remote.php/dav/picture.jpg',
mime: 'image/jpeg',
owner: 'emma'
})
expect(file.root).toBeNull()
})

test('Remove source ending slash', () => {
const file = new Folder({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos/',
owner: 'emma'
})
expect(file.source).toBe('https://cloud.domain.com/remote.php/dav/files/emma/Photos')
})

test('Invalid rename', () => {
const file = new Folder({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos/',
owner: 'emma'
})
expect(() => file.rename('new/folder')).toThrowError('Invalid basename')
})
})

describe('Sanity checks', () => {
test('Invalid id', () => {
expect(() => new File({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg',
mime: 'image/jpeg',
owner: 'emma',
id: '1234' as unknown as number,
})).toThrowError('Invalid id type of value')

expect(() => new File({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg',
mime: 'image/jpeg',
owner: 'emma',
id: -1234,
})).toThrowError('Invalid id type of value')
})

test('Invalid source', () => {
expect(() => new File({} as unknown as NodeData)).toThrowError('Missing mandatory source')
expect(() => new File({
source: 'cloud.domain.com/remote.php/dav/Photos',
mime: 'image/jpeg',
owner: 'emma'
})).toThrowError('Invalid source')
expect(() => new File({
source: '/remote.php/dav/files/emma/Photos/picture.jpg',
mime: 'image/jpeg',
owner: 'emma'
})).toThrowError('Invalid source')

})

test('Invalid mtime', () => {
expect(() => new File({
source: 'https://cloud.domain.com/remote.php/dav/Photos',
mime: 'image',
owner: 'emma',
mtime: 'invalid' as unknown as Date
})).toThrowError('Invalid mtime type')
})


test('Invalid crtime', () => {
expect(() => new File({
source: 'https://cloud.domain.com/remote.php/dav/Photos',
mime: 'image',
owner: 'emma',
crtime: 'invalid' as unknown as Date
})).toThrowError('Invalid crtime type')
})

test('Invalid mime', () => {
expect(() => new File({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg',
mime: 'image',
owner: 'emma'
})).toThrowError('Missing or invalid mandatory mime')
})

test('Invalid attributes', () => {
expect(() => new File({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg',
mime: 'image/jpeg',
owner: 'emma',
attributes: 'test' as unknown as Attribute,
})).toThrowError('Invalid attributes format')
})

test('Invalid permissions', () => {
expect(() => new File({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg',
mime: 'image/jpeg',
owner: 'emma',
permissions: 324,
})).toThrowError('Invalid permissions')
})

test('Invalid size', () => {
expect(() => new File({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg',
mime: 'image/jpeg',
owner: 'emma',
size: 'test' as unknown as number,
})).toThrowError('Invalid size type')
})

test('Invalid owner', () => {
expect(() => new File({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg',
mime: 'image/jpeg',
owner: true as unknown as string,
})).toThrowError('Invalid owner')
})
})

describe('Dav service detection', () => {
test('Known dav services', () => {
const file1 = new File({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg',
mime: 'image/jpeg',
owner: 'emma',
})
expect(file1.isDavRessource).toBe(true)

const file2 = new File({
source: 'https://cloud.domain.com/remote.php/webdav/files/emma/Photos/picture.jpg',
mime: 'image/jpeg',
owner: 'emma',
})
expect(file2.isDavRessource).toBe(true)

const file3 = new File({
source: 'https://cloud.domain.com/public.php/dav/files/emma/Photos/picture.jpg',
mime: 'image/jpeg',
owner: 'emma',
})
expect(file3.isDavRessource).toBe(true)

const file4 = new File({
source: 'https://cloud.domain.com/public.php/webdav/files/emma/Photos/picture.jpg',
mime: 'image/jpeg',
owner: 'emma',
})
expect(file4.isDavRessource).toBe(true)
})

test('Custom dav service', () => {
const file1 = new File({
source: 'https://cloud.domain.com/test.php/dav/files/emma/Photos/picture.jpg',
mime: 'image/jpeg',
owner: 'emma',
}, /test\.php\/dav/)
expect(file1.isDavRessource).toBe(true)

const file2 = new File({
source: 'https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg',
mime: 'image/jpeg',
owner: 'emma',
}, /test\.php\/dav/)
expect(file2.isDavRessource).toBe(false)
})
})
2 changes: 0 additions & 2 deletions __tests__/humanFileSize.spec.ts
Expand Up @@ -6,8 +6,6 @@ declare global {
}
}

jest.mock

describe('humanFileSize', () => {
describe('formatFileSize', () => {
it('renders file sizes with the correct unit', function() {
Expand Down

0 comments on commit 4dfd5c4

Please sign in to comment.