data:
    files: []
    chunks: []

tests:
    -
        description: "Upload when length is 0"
        act:
            operation: upload
            arguments:
                filename: "filename"
                source: { $hex : "" }
                options: { chunkSizeBytes : 4 }
        assert:
            result: "&result"
            data:
                -   
                    { insert : "expected.files", documents : [
                        { _id : "*result",  length : 0, chunkSize : 4, uploadDate : "*actual", md5 : "d41d8cd98f00b204e9800998ecf8427e", filename : "filename" }
                    ] }
    -
        description: "Upload when length is 1"
        act:
            operation: upload
            arguments:
                filename: "filename"
                source: { $hex : "11" }
                options: { chunkSizeBytes : 4 }
        assert:
            result: "&result"
            data:
                - 
                    { insert : "expected.files", documents : [
                        { _id : "*result", length : 1, chunkSize : 4, uploadDate : "*actual", md5 : "47ed733b8d10be225eceba344d533586", filename : "filename" }
                    ] }
                -
                    { insert : "expected.chunks", documents : [
                        { _id : "*actual", files_id : "*result", n : 0, data : { $hex : "11" } }
                    ] }
    -
        description: "Upload when length is 3"
        act:
            operation: upload
            arguments:
                filename: "filename"
                source: { $hex : "112233" }
                options: { chunkSizeBytes : 4 }
        assert:
            result: "&result"
            data:
                - 
                    { insert : "expected.files", documents : [
                        { _id : "*result",  length : 3,  chunkSize : 4, uploadDate : "*actual",  md5 : "bafae3a174ab91fc70db7a6aa50f4f52",  filename : "filename" }
                    ] }
                -
                    { insert : "expected.chunks", documents : [
                        { _id : "*actual", files_id : "*result", n : 0, data : { $hex : "112233" } }
                    ] }
    -
        description: "Upload when length is 4"
        act:
            operation: upload
            arguments:
                filename: "filename"
                source: { $hex : "11223344" }
                options: { chunkSizeBytes : 4 }
        assert:
            result: "&result"
            data:
                - 
                    { insert : "expected.files", documents : [
                        { _id : "*result", length : 4, chunkSize : 4, uploadDate : "*actual", md5 : "7e7c77cff5705d1f7574a25ef6662117", filename : "filename" }
                    ] }
                -
                    { insert : "expected.chunks", documents : [
                        { _id : "*actual", files_id : "*result", n : 0, data : { $hex : "11223344" } }
                    ] }
    -
        description: "Upload when length is 5"
        act:
            operation: upload
            arguments:
                filename: "filename"
                source: { $hex : "1122334455" }
                options: { chunkSizeBytes : 4 }
        assert:
            result: "&result"
            data:
                - 
                    { insert : "expected.files", documents : [
                        { _id : "*result", length : 5, chunkSize : 4, uploadDate : "*actual", md5 : "283d4fea5dded59cf837d3047328f5af", filename : "filename" }
                    ] }
                -
                    { insert : "expected.chunks", documents : [
                        { _id : "*actual", files_id : "*result", n : 0, data : { $hex : "11223344" } },
                        { _id : "*actual", files_id : "*result", n : 1, data : { $hex : "55" } }
                    ] }
    -
        description: "Upload when length is 8"
        act:
            operation: upload
            arguments:
                filename: "filename"
                source: { $hex : "1122334455667788" }
                options: { chunkSizeBytes : 4 }
        assert:
            result: "&result"
            data:
                - 
                    { insert : "expected.files", documents : [
                        { _id : "*result", length : 8, chunkSize : 4, uploadDate : "*actual", md5 : "dd254cdc958e53abaa67da9f797125f5", filename : "filename" }

                    ] }
                -
                    { insert : "expected.chunks", documents : [
                        { _id : "*actual", files_id : "*result", n : 0, data : { $hex : "11223344" } },
                        { _id : "*actual", files_id : "*result", n : 1, data : { $hex : "55667788" } }
                    ] }
    -
        description: "Upload when contentType is provided"
        act:
            operation: upload
            arguments:
                filename: "filename"
                source: { $hex : "11" }
                options: { chunkSizeBytes : 4, contentType : "image/jpeg" }
        assert:
            result: "&result"
            data:
                - 
                    { insert : "expected.files", documents : [
                        { _id : "*result", length : 1, chunkSize : 4, uploadDate : "*actual", md5 : "47ed733b8d10be225eceba344d533586", filename : "filename", contentType : "image/jpeg" }
                    ] }
                -
                    { insert : "expected.chunks", documents : [
                        { _id : "*actual", files_id : "*result", n : 0, data : { $hex : "11" } }
                    ] }
    -
        description: "Upload when metadata is provided"
        act:
            operation: upload
            arguments:
                filename: "filename"
                source: { $hex : "11" }
                options:
                    chunkSizeBytes: 4
                    metadata: { x : 1 }
        assert:
            result: "&result"
            data:
                - 
                    { insert : "expected.files", documents : [
                        { _id : "*result", length : 1, chunkSize : 4, uploadDate : "*actual", md5 : "47ed733b8d10be225eceba344d533586", filename : "filename", metadata : { x : 1 } }
                    ] }
                -
                    { insert : "expected.chunks", documents : [
                        { _id : "*actual", files_id : "*result", n : 0, data : { $hex : "11" } }
                    ] }
    -
        description: "Upload when length is 0 sans MD5"
        act:
            operation: upload
            arguments:
                filename: "filename"
                source: { $hex : "" }
                options: { chunkSizeBytes : 4, disableMD5: true }
        assert:
            result: "&result"
            data:
                -   
                    { insert : "expected.files", documents : [
                        { _id : "*result",  length : 0, chunkSize : 4, uploadDate : "*actual", filename : "filename" }
                    ] }                
    -
        description: "Upload when length is 1 sans MD5"
        act:
            operation: upload
            arguments:
                filename: "filename"
                source: { $hex : "11" }
                options: { chunkSizeBytes : 4, disableMD5: true }
        assert:
            result: "&result"
            data:
                - 
                    { insert : "expected.files", documents : [
                        { _id : "*result", length : 1, chunkSize : 4, uploadDate : "*actual", filename : "filename" }
                    ] }
                -
                    { insert : "expected.chunks", documents : [
                        { _id : "*actual", files_id : "*result", n : 0, data : { $hex : "11" } }
                    ] }
