This page is a work in progress.
This chapter provides a test suite that can be used to test the implementation of an automation client library.
Automation Client Test Suite
The test suite is separated in three sub-parts:
- Basic CRUD operations on documents,
- Blobs management,
- Marshaling extensions.
Only the first part is strictly necessary.
Base CRUD
Create and Read Documents
Scenario
- Create a Folder on / (
Document.Create
). - Create a File child (
Document.Create
). - Create a File child (
Document.Create
). - Update
dc:description
property on second child (Document.SetProperty
). - Update
dc:subjects
property on second child (Document.SetProperty
). - Get Children of Folder (
Document.GetChildren
). - Specify that
dublincore
schema should be fetched. Verify that:
- the folder has two children,
- the second child has the correct
dc:description
anddc:subjects
.
Java Implementation
GitHub Link for CRUD operations tests suite
JavaScript Implementation
Link JS
HTTP Captures
POST /nuxeo/site/automation/Document.Create HTTP/1.1
Host: 127.0.0.1:8080
Content-Length: 130
Authorization: Basic QWRtaW5pc3RyYXRvcjpBZG1pbmlzdHJhdG9y
Origin: http://127.0.0.1:8080
Content-Type: application/json+nxrequest
Accept: */*
X-NXDocumentProperties: dublincore
X-Requested-With: XMLHttpRequest
X-NXVoidOperation: false
Nuxeo-Transaction-Timeout: 35
{ "input" : "doc:/",
"params" : { "name" : "TestDocs",
"properties" : "dc:title=Test Docs \ndc:description=Simple container",
"type" : "Folder"
}
}
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json+nxentity
{ "changeToken" : "1372718688038",
"contextParameters" : { },
"entity-type" : "document",
"facets" : [ "Folderish" ],
"lastModified" : "2013-07-01T22:44:48.03Z",
"path" : "/TestDocs",
"properties" : { "dc:contributors" : [ "Administrator" ],
"dc:coverage" : null,
"dc:created" : "2013-07-01T22:44:48.03Z",
"dc:creator" : "Administrator",
"dc:description" : "Simple container",
"dc:expired" : null,
"dc:format" : null,
"dc:issued" : null,
"dc:language" : null,
"dc:lastContributor" : "Administrator",
"dc:modified" : "2013-07-01T22:44:48.03Z",
"dc:nature" : null,
"dc:publisher" : null,
"dc:rights" : null,
"dc:source" : null,
"dc:subjects" : [ ],
"dc:title" : "Test Docs",
"dc:valid" : null
},
"repository" : "default",
"state" : "project",
"title" : "Test Docs",
"type" : "Folder",
"uid" : "e27bc86b-d5f1-4ba9-a8e4-3ce96340f301",
"versionLabel" : ""
}
POST /nuxeo/site/automation/Document.Create HTTP/1.1
Host: 127.0.0.1:8080
Content-Length: 69
Authorization: Basic QWRtaW5pc3RyYXRvcjpBZG1pbmlzdHJhdG9y
Origin: http://127.0.0.1:8080
Content-Type: application/json+nxrequest
Accept: */*
X-NXDocumentProperties: dublincore
X-Requested-With: XMLHttpRequest
X-NXVoidOperation: false
Nuxeo-Transaction-Timeout: 35
{ "input" : "doc:/TestDocs",
"params" : { "name" : "TestFile1",
"type" : "File"
}
}
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json+nxentity
{ "changeToken" : "1372718688058",
"contextParameters" : { },
"entity-type" : "document",
"facets" : [ "Downloadable",
"Commentable",
"Versionable",
"Publishable",
"Thumbnail",
"HasRelatedText"
],
"lastModified" : "2013-07-01T22:44:48.05Z",
"path" : "/TestDocs/TestFile1",
"properties" : { "dc:contributors" : [ "Administrator" ],
"dc:coverage" : null,
"dc:created" : "2013-07-01T22:44:48.05Z",
"dc:creator" : "Administrator",
"dc:description" : null,
"dc:expired" : null,
"dc:format" : null,
"dc:issued" : null,
"dc:language" : null,
"dc:lastContributor" : "Administrator",
"dc:modified" : "2013-07-01T22:44:48.05Z",
"dc:nature" : null,
"dc:publisher" : null,
"dc:rights" : null,
"dc:source" : null,
"dc:subjects" : [ ],
"dc:title" : null,
"dc:valid" : null
},
"repository" : "default",
"state" : "project",
"title" : "TestFile1",
"type" : "File",
"uid" : "29e654b3-02ae-4600-a057-d487fbac8fbd",
"versionLabel" : "0.0"
}
POST /nuxeo/site/automation/Document.Create HTTP/1.1
Host: 127.0.0.1:8080
Content-Length: 69
Authorization: Basic QWRtaW5pc3RyYXRvcjpBZG1pbmlzdHJhdG9y
Origin: http://127.0.0.1:8080
Content-Type: application/json+nxrequest
Accept: */*
X-NXDocumentProperties: dublincore
X-Requested-With: XMLHttpRequest
X-NXVoidOperation: false
Nuxeo-Transaction-Timeout: 35
{ "input" : "doc:/TestDocs",
"params" : { "name" : "TestFile2",
"type" : "File"
}
}
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json+nxentity
{ "changeToken" : "1372718688083",
"contextParameters" : { },
"entity-type" : "document",
"facets" : [ "Downloadable",
"Commentable",
"Versionable",
"Publishable",
"Thumbnail",
"HasRelatedText"
],
"lastModified" : "2013-07-01T22:44:48.08Z",
"path" : "/TestDocs/TestFile2",
"properties" : { "dc:contributors" : [ "Administrator" ],
"dc:coverage" : null,
"dc:created" : "2013-07-01T22:44:48.08Z",
"dc:creator" : "Administrator",
"dc:description" : null,
"dc:expired" : null,
"dc:format" : null,
"dc:issued" : null,
"dc:language" : null,
"dc:lastContributor" : "Administrator",
"dc:modified" : "2013-07-01T22:44:48.08Z",
"dc:nature" : null,
"dc:publisher" : null,
"dc:rights" : null,
"dc:source" : null,
"dc:subjects" : [ ],
"dc:title" : null,
"dc:valid" : null
},
"repository" : "default",
"state" : "project",
"title" : "TestFile2",
"type" : "File",
"uid" : "7493912e-5d59-4041-9efc-a907c1d1fa07",
"versionLabel" : "0.0"
}
POST /nuxeo/site/automation/Document.Update HTTP/1.1
Host: 127.0.0.1:8080
Content-Length: 133
Authorization: Basic QWRtaW5pc3RyYXRvcjpBZG1pbmlzdHJhdG9y
Origin: http://127.0.0.1:8080
Content-Type: application/json+nxrequest
Accept: */*
X-NXDocumentProperties: dublincore
X-Requested-With: XMLHttpRequest
X-NXVoidOperation: false
Nuxeo-Transaction-Timeout: 35
{ "input" : "doc:/TestDocs/TestFile2",
"params" : { "properties" : "dc:description=Simple File\ndc:subjects=subject1,subject2",
"save" : "true"
}
}
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json+nxentity
{ "changeToken" : "1372718688104",
"contextParameters" : { },
"entity-type" : "document",
"facets" : [ "Downloadable",
"Commentable",
"Versionable",
"Publishable",
"Thumbnail",
"HasRelatedText"
],
"lastModified" : "2013-07-01T22:44:48.10Z",
"path" : "/TestDocs/TestFile2",
"properties" : { "dc:contributors" : [ "Administrator" ],
"dc:coverage" : null,
"dc:created" : "2013-07-01T22:44:48.08Z",
"dc:creator" : "Administrator",
"dc:description" : "Simple File",
"dc:expired" : null,
"dc:format" : null,
"dc:issued" : null,
"dc:language" : null,
"dc:lastContributor" : "Administrator",
"dc:modified" : "2013-07-01T22:44:48.10Z",
"dc:nature" : null,
"dc:publisher" : null,
"dc:rights" : null,
"dc:source" : null,
"dc:subjects" : [ "subject1",
"subject2"
],
"dc:title" : null,
"dc:valid" : null
},
"repository" : "default",
"state" : "project",
"title" : "TestFile2",
"type" : "File",
"uid" : "7493912e-5d59-4041-9efc-a907c1d1fa07",
"versionLabel" : "0.0"
}
POST /nuxeo/site/automation/Document.Fetch HTTP/1.1
Authorization: Basic QWRtaW5pc3RyYXRvcjpBZG1pbmlzdHJhdG9y
Content-Type: application/json+nxrequest
Accept: application/json+nxentity, */*
Content-Length: 48
Host: localhost:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.2.4 (java 1.5)
{"params":{"value":"/TestFolder1"},"context":{}}
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json+nxentity
Transfer-Encoding: chunked
Date: Thu, 25 Jul 2013 14:20:03 GMT
{
"entity-type": "document",
"repository": "default",
"uid": "6879c9c5-0fdf-4d53-85d0-32c8fa94a9e0",
"path": "/TestFolder1",
"type": "Folder",
"state": "project",
"versionLabel": "",
"title": "Test Folder2",
"lastModified": "2013-07-25T14:20:03.90Z",
"facets": [
"Folderish"
],
"changeToken": "1374762003906",
"contextParameters": {}
}
POST /nuxeo/site/automation/Document.GetChildren HTTP/1.1
Authorization: Basic QWRtaW5pc3RyYXRvcjpBZG1pbmlzdHJhdG9y
Content-Type: application/json+nxrequest
Accept: application/json+nxentity, */*
Content-Length: 82
Host: localhost:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.2.4 (java 1.5)
{
"input": {
"entity-type": "string",
"value": "/TestFolder1"
},
"params": {},
"context": {}
}
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json+nxentity
Transfer-Encoding: chunked
Date: Thu, 25 Jul 2013 14:20:03 GMT
{
"entity-type": "documents",
"entries": [
{
"entity-type": "document",
"repository": "default",
"uid": "dc499ced-e140-46e6-a5c4-58fbc19b589c",
"path": "/TestFolder1/TestFile1",
"type": "File",
"state": "project",
"versionLabel": "0.0",
"title": "TestFile1",
"lastModified": "2013-07-25T14:20:03.95Z",
"facets": [
"Downloadable",
"Commentable",
"Versionable",
"Publishable",
"Thumbnail",
"HasRelatedText"
],
"changeToken": "1374762003951",
"contextParameters": {}
},
{
"entity-type": "document",
"repository": "default",
"uid": "98181b11-ef91-48fa-b202-091f5d2ee809",
"path": "/TestFolder1/TestFile2",
"type": "File",
"state": "project",
"versionLabel": "0.0",
"title": "TestFile2",
"lastModified": "2013-07-25T14:20:04.04Z",
"facets": [
"Downloadable",
"Commentable",
"Versionable",
"Publishable",
"Thumbnail",
"HasRelatedText"
],
"changeToken": "1374762004043",
"contextParameters": {}
}
]
}
Pagination
Scenario
- Create a Folder on / (
Document.Create
). - Create three Files children.
Call
Document.PageProvider
with "select * from Document where
ecm:parentId
= ?
" with- queryParams = Folder uuid
- pageSize = 2
- page = 1
Verify:
- pageCount=2
- the page contains two docs.
Call
Document.PageProvider
with "select * from Document where
ecm:parentId
= ?
" with- queryParams = Folder uuid
- pageSize = 2
- page = 2
Verify:
- pageCount=2
- the page contains one document.
Java Implementation
GitHub Link for Pagination operations tests suite
HTTP Capture
POST /nuxeo/site/automation/Document.PageProvider HTTP/1.1
Authorization: Basic QWRtaW5pc3RyYXRvcjpBZG1pbmlzdHJhdG9y
Content-Type: application/json+nxrequest
Accept: application/json+nxentity, */*
Content-Length: 160
Host: localhost:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.2.4 (java 1.5)
{
"params": {
"queryParams": "b583b0a7-cae4-4961-b94d-29c469ca8012",
"page": "0",
"query": "select * from Document where ecm:parentId = ?",
"pageSize": "2"
},
"context": {}
}
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json+nxentity
Transfer-Encoding: chunked
Date: Thu, 25 Jul 2013 15:24:47 GMT
{
"entity-type": "documents",
"isPaginable": true,
"totalSize": 3,
"pageIndex": 0,
"pageSize": 2,
"pageCount": 2,
"entries": [
{
"entity-type": "document",
"repository": "default",
"uid": "3f76a415-ad73-4522-9450-d12af25b7fb4",
"path": "/TestFolder2/TestFile3",
"type": "File",
"state": "project",
"versionLabel": "0.0",
"title": "TestFile3",
"lastModified": "2013-07-25T15:23:58.63Z",
"facets": [
"Downloadable",
"Commentable",
"Versionable",
"Publishable",
"Thumbnail",
"HasRelatedText"
],
"changeToken": "1374765838639",
"contextParameters": {
"documentURL": "/nuxeo/nxdoc/default/3f76a415-ad73-4522-9450-d12af25b7fb4/view_documents"
}
},
{
"entity-type": "document",
"repository": "default",
"uid": "1e751ded-c659-46da-8982-0963575f48f8",
"path": "/TestFolder2/TestFile1",
"type": "File",
"state": "project",
"versionLabel": "0.0",
"title": "TestFile1",
"lastModified": "2013-07-25T15:23:58.55Z",
"facets": [
"Downloadable",
"Commentable",
"Versionable",
"Publishable",
"Thumbnail",
"HasRelatedText"
],
"changeToken": "1374765838558",
"contextParameters": {
"documentURL": "/nuxeo/nxdoc/default/1e751ded-c659-46da-8982-0963575f48f8/view_documents"
}
}
]
}
Blobs
Direct Blob Upload
Scenario
- Create a Folder on / (
Document.Create
). - Call
FileManager.Import
passing a testText.txt file and setting context to Folder. - Call
FileManager.Import
passing a testBlob.bin binary file and setting context to Folder. Verify that:
- two documents are created, of types File and Note.
Java Implementation
GitHub link for Blob operations tests suite
HTTP Capture
POST /nuxeo/site/automation/FileManager.Import HTTP/1.1
Authorization: Basic QWRtaW5pc3RyYXRvcjpBZG1pbmlzdHJhdG9y
Content-Type: multipart/related;
boundary="----=_Part_0_1227289322.1374766516160"
Accept: application/json+nxentity, */*
Transfer-Encoding: chunked
Host: localhost:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.2.4 (java 1.5)
e7
------=_Part_0_1227289322.1374766516160
Content-Type: application/json+nxrequest; charset=UTF-8
Content-Transfer-Encoding: 8bit
Content-ID: request
Content-Length: 57
{"params":{},"context":{"currentDocument":"/FolderBlob"}}
f5
------=_Part_0_1227289322.1374766516160
Content-Type: text/xml
Content-Transfer-Encoding: binary
Content-Disposition: attachment;
filename=automation-test-5983650304333926591.xml
Content-ID: input
Content-Length: 16
<doc>mydoc</doc>
------=_Part_0_1227289322.1374766516160--
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json+nxentity
Transfer-Encoding: chunked
Date: Thu, 25 Jul 2013 15:35:16 GMT
{
"entity-type": "document",
"repository": "default",
"uid": "77ec49fb-1832-4124-b8f6-270d53ac20bb",
"path": "/FolderBlob/automation-test-59836503",
"type": "File",
"state": "project",
"versionLabel": "0.0",
"title": "automation-test-5983650304333926591.xml",
"lastModified": "2013-07-25T15:35:16.24Z",
"facets": [
"Downloadable",
"Commentable",
"Versionable",
"Publishable",
"Thumbnail",
"HasRelatedText"
],
"changeToken": "1374766516241",
"contextParameters": {}
}
POST /nuxeo/site/automation/Blob.Attach HTTP/1.1
X-NXVoidOperation: true
Authorization: Basic QWRtaW5pc3RyYXRvcjpBZG1pbmlzdHJhdG9y
Content-Type: multipart/related;
boundary="----=_Part_1_2072469418.1374766516423"
Accept: application/json+nxentity, */*
Transfer-Encoding: chunked
Host: localhost:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.2.4 (java 1.5)
------=_Part_1_2072469418.1374766516423
Content-Type: application/json+nxrequest; charset=UTF-8
Content-Transfer-Encoding: 8bit
Content-ID: request
Content-Length: 46
{"params":{"document":"/myfile"},"context":{}}
------=_Part_1_2072469418.1374766516423
Content-Type: image/jpeg
Content-Transfer-Encoding: binary
Content-Disposition: attachment; filename=creationFields.json
Content-ID: input
Content-Length: 1288
[
{
"fieldType": "string",
"description": "desc field0",
"roles": [
"Decision",
"Score"
],
"name": "field0",
"columnName": "col0",
"sqlTypeHint": "whatever"
},
{
"fieldType": "string",
"description": "desc field1",
"roles": [
"Decision",
"Score"
],
"name": "field1",
"columnName": "col1",
"sqlTypeHint": "whatever"
},
{
"fieldType": "string",
"description": "desc field2",
"roles": [
"Decision",
"Score"
],
"name": "field2",
"columnName": "col2",
"sqlTypeHint": "whatever"
},
{
"fieldType": "string",
"description": "desc field3",
"roles": [
"Decision",
"Score"
],
"name": "field3",
"columnName": "col3",
"sqlTypeHint": "whatever"
},
{
"fieldType": "string",
"description": "desc field4",
"roles": [
"Decision",
"Score"
],
"name": "field4",
"columnName": "col4",
"sqlTypeHint": "whatever"
}
]
------=_Part_1_2072469418.1374766516423--
HTTP/1.1 204 No Content
Server: Apache-Coyote/1.1
Date: Thu, 25 Jul 2013 15:35:16 GMT
Blobs Upload via Batch Manager
Scenario
Upload two blobs via batch manager:
- testText.txt,
- testBlob.bin.
Call
FileManager.Import
via batch API:- set currentDocument to /
Verify that:
- two documents are created, of types File and Note.
Java Implementation
XXX Link the Java unit test
HTTP Capture
XXX Commented HTTP capture
Blobs Attach via Batch Manager
Scenario
- Create a File on / (
Document.Create
). Upload one blob via batch manager:
- testText.txt.
Call
Document.Update
with two properties:dc:description
file:content
: reference Blob 1 from batch.
Fetch the Document:
- Specify to fetch the
dublincore
schema.
- Specify to fetch the
- Download the blob.
Verify that:
- Description was updated.
- Blob exists and contains the expected text.
Java Implementation
XXX Link the Java unit test
HTTP Capture
XXX Commented Http capture
Marshaling Extensions
Manage Complex Properties
Scenario
- Create a File on / (
Document.Create
). Call
Document.Update
:dc:description
,dc:subjects
,- some complex property.
Fetch the Document:
- specify to fetch all schemas.
Verify that:
- document content is ok (scalar, list and complex).
Java Implementation
GitHub link for Complex Properties operations tests suite
HTTP Capture
POST /nuxeo/site/automation/Document.Create HTTP/1.1
Authorization: Basic QWRtaW5pc3RyYXRvcjpBZG1pbmlzdHJhdG9y
Content-Type: application/json+nxrequest
Accept: application/json+nxentity, */*
Content-Length: 1484
Host: localhost:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.2.4 (java 1.5)
{
"input": "doc:c3fbb3bd-8646-4b81-9380-63da531856e8",
"params": {
"name": "testDoc",
"properties": "ds:fields=[ { \"fieldType\": \"string\", \"description\": \"desc field0\", \"roles\": [ \"Decision\", \"Score\" ], \"name\": \"field0\", \"columnName\": \"col0\", \"sqlTypeHint\": \"whatever\" }, { \"fieldType\": \"string\", \"description\": \"desc field1\", \"roles\": [ \"Decision\", \"Score\" ], \"name\": \"field1\", \"columnName\": \"col1\", \"sqlTypeHint\": \"whatever\" }, { \"fieldType\": \"string\", \"description\": \"desc field2\", \"roles\": [ \"Decision\", \"Score\" ], \"name\": \"field2\", \"columnName\": \"col2\", \"sqlTypeHint\": \"whatever\" }, { \"fieldType\": \"string\", \"description\": \"desc field3\", \"roles\": [ \"Decision\", \"Score\" ], \"name\": \"field3\", \"columnName\": \"col3\", \"sqlTypeHint\": \"whatever\" }, { \"fieldType\": \"string\", \"description\": \"desc field4\", \"roles\": [ \"Decision\", \"Score\" ], \"name\": \"field4\", \"columnName\": \"col4\", \"sqlTypeHint\": \"whatever\" }]\nds:tableName=MyTable\ndc:title=testDoc\n",
"type": "DataSet"
},
"context": {}
}
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json+nxentity
Transfer-Encoding: chunked
Date: Thu, 25 Jul 2013 15:45:25 GMT
{
"entity-type": "document",
"repository": "default",
"uid": "ad9f8940-6aa8-450f-80fd-05af3f4836fb",
"path": "/testDoc",
"type": "DataSet",
"state": "undefined",
"versionLabel": "0.0",
"title": "testDoc",
"lastModified": "2013-07-25T15:45:25.03Z",
"facets": [
"Downloadable",
"Commentable",
"Versionable",
"Publishable",
"Thumbnail",
"HasRelatedText"
],
"changeToken": "1374767125039",
"contextParameters": {}
}
POST /nuxeo/site/automation/Document.Update HTTP/1.1
Authorization: Basic QWRtaW5pc3RyYXRvcjpBZG1pbmlzdHJhdG9y
Content-Type: application/json+nxrequest
Accept: application/json+nxentity, */*
Content-Length: 465
Host: localhost:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.2.4 (java 1.5)
{
"input": "doc:ad9f8940-6aa8-450f-80fd-05af3f4836fb",
"params": {
"properties": "ds:fields=[ { \"fieldType\":\"string\", \"description\":\"desc fieldA\", \"name\":\"fieldA\", \"columnName\":\"colA\", \"sqlTypeHint\":\"whatever\" }, { \"fieldType\":\"string\", \"description\":\"desc fieldB\", \"name\":\"fieldB\", \"columnName\":\"colB\", \"sqlTypeHint\":\"whatever\" }]\n"
},
"context": {}
}
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json+nxentity
Transfer-Encoding: chunked
Date: Thu, 25 Jul 2013 15:45:25 GMT
{
"entity-type": "document",
"repository": "default",
"uid": "ad9f8940-6aa8-450f-80fd-05af3f4836fb",
"path": "/testDoc",
"type": "DataSet",
"state": "undefined",
"versionLabel": "0.0",
"title": "testDoc",
"lastModified": "2013-07-25T15:45:25.08Z",
"facets": [
"Downloadable",
"Commentable",
"Versionable",
"Publishable",
"Thumbnail",
"HasRelatedText"
],
"changeToken": "1374767125085",
"contextParameters": {}
}
Custom Marshaling
Scenario
- Create a Folder on / (
Document.Create
). - Create three Files children.
Call
Resultset.PageProvider
with "select
dc:title , dc:desciption , ecm:type from Document where ecm:parentId
= ?
" with:queryParams
= Folder uuid,pageSize
= 2,page
= 1.
Verify that:
pageCount
=2- the page contains two records,
- the content of returned recordset is correct.
Java Implementation
XXX Link the Java unit test
HTTP Capture
XXX Commented HTTP capture
Managing Business Objects
Scenario
- Create a client side 'Business' bean (simple POJO with getter/setter on properties).
- Register the POJO in client Marshaling engine.
Call
Business.BusinessCreateOperation
with:two properties:
name
,parentPath
: reference the parent of the document to create,
one input:
- the POJO itself.
- Get the returned POJO (with id set).
- Update the POJO title.
Call
Business.BusinessUpdateOperation
with:one property:
- id: references the document id to update
with one input:
- the POJO itself.
Verify that:
- the id is not null,
- the title was updated.
Java Implementation
GitHub link for Business Object operations tests suite
HTTP Capture
POST /nuxeo/site/automation/Business.BusinessCreateOperation HTTP/1.1
Authorization: Basic QWRtaW5pc3RyYXRvcjpBZG1pbmlzdHJhdG9y
Content-Type: application/json+nxrequest
Accept: application/json+nxentity, */*
Content-Length: 206
Host: localhost:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.2.4 (java 1.5)
{
"input": {
"entity-type": "BusinessBeanAdapter",
"value": {
"id": null,
"type": "Note",
"description": "File description",
"title": "Note",
"note": "Note Content"
}
},
"params": {
"name": "Note",
"parentPath": "/"
},
"context": {}
}
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json+nxentity
Transfer-Encoding: chunked
Date: Thu, 25 Jul 2013 15:45:45 GMT
{
"entity-type": "BusinessBeanAdapter",
"value": {
"type": "Note",
"id": "d82d9824-20ca-402a-a586-790103a018b2",
"description": "File description",
"note": "Note Content",
"title": "Note"
}
}
POST /nuxeo/site/automation/Business.BusinessUpdateOperation HTTP/1.1
Authorization: Basic QWRtaW5pc3RyYXRvcjpBZG1pbmlzdHJhdG9y
Content-Type: application/json+nxrequest
Accept: application/json+nxentity, */*
Content-Length: 212
Host: localhost:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.2.4 (java 1.5)
{
"input": {
"entity-type": "BusinessBeanAdapter",
"value": {
"id": "d82d9824-20ca-402a-a586-790103a018b2",
"type": "Note",
"description": "File description",
"title": "Update",
"note": "Note Content"
}
},
"params": {},
"context": {}
}
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json+nxentity
Transfer-Encoding: chunked
Date: Thu, 25 Jul 2013 15:45:45 GMT
{
"entity-type": "BusinessBeanAdapter",
"value": {
"type": "Note",
"id": "d82d9824-20ca-402a-a586-790103a018b2",
"description": "File description",
"note": "Note Content",
"title": "Update"
}
}
Client Compatibility Matrix
Compatibility Level
This compatibility matrix focus on two aspects :
- protocol compliance: capability to achieve simple usage scenario as defined inside the tests,
- convenience features: additional conveniant features that may be provided on top of JSON-RPC library.
Protocol Compliance
Automation being a simple JSON-RPC, you should be able to do everything from every language as long as you can do JSON Marshaling and HTTP calls.
Hence for each test scenario, the target client library will be qualified with one of the three statuses:
- Ok: built-in feature,
- Easy: test can be achieved with minor tweak (like format JSON partially by hand ...),
- Fail: feature is not possible or complex to use.
Convenience Features
This aspect is here to highlight the specific feature that may be provided by each client library implementation.
This feature list currently includes:
Static Check Before Call
Ability to check operation arguments and types before actually doing the server side call.
Working with Document Object
Ability to work fluently with Document objects:
- fetch a document and retrieve it as a Document object,
- update the Document object,
- send it back to the server.
Background Upload/Download Pool
Manage HTTP threads pool for upload/download in background.
Caching
Support client side caching to provide minimal offline capability.
Advanced Exception Management
Retrieve advanced information about potential server side exception.
Advanced Authentication
Support integrated authentication (via portal_sso).
Layout Management
Support for fetching layouts definition associated to documents.
Compatibility Matrix
Java Client | JavaScript Client | Python Client | PHP Client | C# Client | Android Client | Dart Client | |||
---|---|---|---|---|---|---|---|---|---|
Compatibility | |||||||||
Base | |||||||||
Create and read docs | |||||||||
Pagination | |||||||||
Blobs | |||||||||
Direct Blob upload | |||||||||
Blob upload via batch manager | |||||||||
Blob update vua batch manager | |||||||||
Marshaling | |||||||||
Complex properties | |||||||||
Custom marshaling | |||||||||
Business Objects | |||||||||
Convenience | |||||||||
Static checks | |||||||||
Working with documents | |||||||||
Background upload/download | |||||||||
Caching | |||||||||
Advanced Exception management | |||||||||
Advanced Authentication | |||||||||
Layout Management |
Running the Tests
Client Side Code
The client side code depends on the following underlying technologies:
- JUnit tests for Java client,
- NUnit tests for .Net client,
- HTML/JS for JavaScript client,
- Python script for Python client,
- JUnit for both Android clients (the nuxeo-android-connector and the deprecated nuxeo-automation-thin-client),
- ? for PHP client,
- ? for Dart client.
Server Side Code
Compatibility tests have to be run against the lastest version of Nuxeo CAP. For now, no specific additional module is required.
Keep in mind that the tests do create document on the tested Nuxeo instance, don't run it against a production server otherwise you will end up with garbage in your repository since tests don't enforce cleanup.