Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
M
mongo-php-library
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
sinan
mongo-php-library
Commits
88b9f6b9
Commit
88b9f6b9
authored
Oct 02, 2018
by
Jeremy Mikola
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
PHPLIB-387: Support errors and unordered writes in CRUD spec tests
parent
21d35954
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
107 additions
and
39 deletions
+107
-39
CrudSpecFunctionalTest.php
tests/Collection/CrudSpecFunctionalTest.php
+107
-39
No files found.
tests/Collection/CrudSpecFunctionalTest.php
View file @
88b9f6b9
...
@@ -2,7 +2,11 @@
...
@@ -2,7 +2,11 @@
namespace
MongoDB\Tests\Collection
;
namespace
MongoDB\Tests\Collection
;
use
MongoDB\BulkWriteResult
;
use
MongoDB\Collection
;
use
MongoDB\Collection
;
use
MongoDB\InsertManyResult
;
use
MongoDB\Driver\Exception\BulkWriteException
;
use
MongoDB\Driver\Exception\RuntimeException
;
use
MongoDB\Operation\FindOneAndReplace
;
use
MongoDB\Operation\FindOneAndReplace
;
use
IteratorIterator
;
use
IteratorIterator
;
use
LogicException
;
use
LogicException
;
...
@@ -39,8 +43,16 @@ class CrudSpecFunctionalTest extends FunctionalTestCase
...
@@ -39,8 +43,16 @@ class CrudSpecFunctionalTest extends FunctionalTestCase
$expectedData
=
isset
(
$test
[
'outcome'
][
'collection'
][
'data'
])
?
$test
[
'outcome'
][
'collection'
][
'data'
]
:
null
;
$expectedData
=
isset
(
$test
[
'outcome'
][
'collection'
][
'data'
])
?
$test
[
'outcome'
][
'collection'
][
'data'
]
:
null
;
$this
->
initializeData
(
$initialData
,
$expectedData
);
$this
->
initializeData
(
$initialData
,
$expectedData
);
$result
=
$this
->
executeOperation
(
$test
[
'operation'
]);
$result
=
null
;
$this
->
executeOutcome
(
$test
[
'operation'
],
$test
[
'outcome'
],
$result
);
$exception
=
null
;
try
{
$result
=
$this
->
executeOperation
(
$test
[
'operation'
]);
}
catch
(
RuntimeException
$e
)
{
$exception
=
$e
;
}
$this
->
executeOutcome
(
$test
[
'operation'
],
$test
[
'outcome'
],
$result
,
$exception
);
}
}
public
function
provideSpecificationTests
()
public
function
provideSpecificationTests
()
...
@@ -116,10 +128,9 @@ class CrudSpecFunctionalTest extends FunctionalTestCase
...
@@ -116,10 +128,9 @@ class CrudSpecFunctionalTest extends FunctionalTestCase
);
);
case
'bulkWrite'
:
case
'bulkWrite'
:
$results
=
$this
->
prepareBulkWriteArguments
(
$operation
[
'arguments'
]);
return
$this
->
collection
->
bulkWrite
(
return
$this
->
collection
->
bulkWrite
(
array_
diff_key
(
$results
,
[
'options'
=>
1
]),
array_
map
([
$this
,
'prepareBulkWriteRequest'
],
$operation
[
'arguments'
][
'requests'
]),
$results
[
'options'
]
isset
(
$operation
[
'arguments'
][
'options'
])
?
$operation
[
'arguments'
][
'options'
]
:
[
]
);
);
case
'count'
:
case
'count'
:
...
@@ -174,7 +185,7 @@ class CrudSpecFunctionalTest extends FunctionalTestCase
...
@@ -174,7 +185,7 @@ class CrudSpecFunctionalTest extends FunctionalTestCase
case
'insertMany'
:
case
'insertMany'
:
return
$this
->
collection
->
insertMany
(
return
$this
->
collection
->
insertMany
(
$operation
[
'arguments'
][
'documents'
],
$operation
[
'arguments'
][
'documents'
],
array_diff_key
(
$operation
[
'arguments'
],
[
'documents'
=>
1
])
isset
(
$operation
[
'arguments'
][
'options'
])
?
$operation
[
'arguments'
][
'options'
]
:
[]
);
);
case
'insertOne'
:
case
'insertOne'
:
...
@@ -191,16 +202,26 @@ class CrudSpecFunctionalTest extends FunctionalTestCase
...
@@ -191,16 +202,26 @@ class CrudSpecFunctionalTest extends FunctionalTestCase
/**
/**
* Executes an "outcome" block.
* Executes an "outcome" block.
*
*
* @param array $operation
* @param array $operation
* @param array $outcome
* @param array $outcome
* @param mixed $actualResult
* @param mixed $result
* @param RuntimeException $exception
* @return mixed
* @return mixed
* @throws LogicException if the operation is unsupported
* @throws LogicException if the operation is unsupported
*/
*/
private
function
executeOutcome
(
array
$operation
,
array
$outcome
,
$
actualResult
)
private
function
executeOutcome
(
array
$operation
,
array
$outcome
,
$
result
,
RuntimeException
$exception
=
null
)
{
{
$expectedError
=
array_key_exists
(
'error'
,
$outcome
)
?
$outcome
[
'error'
]
:
false
;
if
(
$expectedError
)
{
$this
->
assertNull
(
$result
);
$this
->
assertNotNull
(
$exception
);
$result
=
$this
->
extractResultFromException
(
$operation
,
$outcome
,
$exception
);
}
if
(
array_key_exists
(
'result'
,
$outcome
))
{
if
(
array_key_exists
(
'result'
,
$outcome
))
{
$this
->
executeAssertResult
(
$operation
,
$outcome
[
'result'
],
$
actualR
esult
);
$this
->
executeAssertResult
(
$operation
,
$outcome
[
'result'
],
$
r
esult
);
}
}
if
(
isset
(
$outcome
[
'collection'
]))
{
if
(
isset
(
$outcome
[
'collection'
]))
{
...
@@ -212,6 +233,42 @@ class CrudSpecFunctionalTest extends FunctionalTestCase
...
@@ -212,6 +233,42 @@ class CrudSpecFunctionalTest extends FunctionalTestCase
}
}
}
}
/**
* Extracts a result from an exception.
*
* Errors for bulkWrite and insertMany operations may still report a write
* result. This method will attempt to extract such a result so that it can
* be used in executeAssertResult().
*
* If no result can be extracted, null will be returned.
*
* @param array $operation
* @param RuntimeException $exception
* @return mixed
*/
private
function
extractResultFromException
(
array
$operation
,
array
$outcome
,
RuntimeException
$exception
)
{
switch
(
$operation
[
'name'
])
{
case
'bulkWrite'
:
$insertedIds
=
isset
(
$outcome
[
'result'
][
'insertedIds'
])
?
$outcome
[
'result'
][
'insertedIds'
]
:
[];
if
(
$exception
instanceof
BulkWriteException
)
{
return
new
BulkWriteResult
(
$exception
->
getWriteResult
(),
$insertedIds
);
}
break
;
case
'insertMany'
:
$insertedIds
=
isset
(
$outcome
[
'result'
][
'insertedIds'
])
?
$outcome
[
'result'
][
'insertedIds'
]
:
[];
if
(
$exception
instanceof
BulkWriteException
)
{
return
new
InsertManyResult
(
$exception
->
getWriteResult
(),
$insertedIds
);
}
break
;
}
return
null
;
}
/**
/**
* Executes the "result" section of an "outcome" block.
* Executes the "result" section of an "outcome" block.
*
*
...
@@ -236,6 +293,9 @@ class CrudSpecFunctionalTest extends FunctionalTestCase
...
@@ -236,6 +293,9 @@ class CrudSpecFunctionalTest extends FunctionalTestCase
break
;
break
;
case
'bulkWrite'
:
case
'bulkWrite'
:
$this
->
assertInternalType
(
'array'
,
$expectedResult
);
$this
->
assertInstanceOf
(
'MongoDB\BulkWriteResult'
,
$actualResult
);
if
(
isset
(
$expectedResult
[
'deletedCount'
]))
{
if
(
isset
(
$expectedResult
[
'deletedCount'
]))
{
$this
->
assertSame
(
$expectedResult
[
'deletedCount'
],
$actualResult
->
getDeletedCount
());
$this
->
assertSame
(
$expectedResult
[
'deletedCount'
],
$actualResult
->
getDeletedCount
());
}
}
...
@@ -307,6 +367,7 @@ class CrudSpecFunctionalTest extends FunctionalTestCase
...
@@ -307,6 +367,7 @@ class CrudSpecFunctionalTest extends FunctionalTestCase
break
;
break
;
case
'insertMany'
:
case
'insertMany'
:
$this
->
assertInternalType
(
'array'
,
$expectedResult
);
$this
->
assertInstanceOf
(
'MongoDB\InsertManyResult'
,
$actualResult
);
$this
->
assertInstanceOf
(
'MongoDB\InsertManyResult'
,
$actualResult
);
if
(
isset
(
$expectedResult
[
'insertedCount'
]))
{
if
(
isset
(
$expectedResult
[
'insertedCount'
]))
{
...
@@ -383,36 +444,43 @@ class CrudSpecFunctionalTest extends FunctionalTestCase
...
@@ -383,36 +444,43 @@ class CrudSpecFunctionalTest extends FunctionalTestCase
}
}
}
}
private
function
prepareBulkWriteArguments
(
$arguments
)
/**
* Prepares a request element for a bulkWrite operation.
*
* @param array $request
* @return array
*/
private
function
prepareBulkWriteRequest
(
array
$request
)
{
{
$operations
=
[];
switch
(
$request
[
'name'
])
{
$operations
[
'options'
]
=
$arguments
[
'options'
];
case
'deleteMany'
:
foreach
(
$arguments
[
'requests'
]
as
$request
)
{
case
'deleteOne'
:
$innerArray
=
[];
return
[
$request
[
'name'
]
=>
[
switch
(
$request
[
'name'
])
{
$request
[
'arguments'
][
'filter'
],
case
'deleteMany'
:
array_diff_key
(
$request
[
'arguments'
],
[
'filter'
=>
1
]),
case
'deleteOne'
:
]];
$options
=
array_diff_key
(
$request
[
'arguments'
],
[
'filter'
=>
1
]);
$innerArray
=
[
$request
[
'arguments'
][
'filter'
],
$options
];
case
'insertOne'
:
break
;
return
[
'insertOne'
=>
[
$request
[
'arguments'
][
'document'
]
]];
case
'insertOne'
:
$innerArray
=
[
$request
[
'arguments'
][
'document'
]];
case
'replaceOne'
:
break
;
return
[
'replaceOne'
=>
[
case
'replaceOne'
:
$request
[
'arguments'
][
'filter'
],
$options
=
array_diff_key
(
$request
[
'arguments'
],
[
'filter'
=>
1
,
'replacement'
=>
1
]);
$request
[
'arguments'
][
'replacement'
],
$innerArray
=
[
$request
[
'arguments'
][
'filter'
],
$request
[
'arguments'
][
'replacement'
],
$options
];
array_diff_key
(
$request
[
'arguments'
],
[
'filter'
=>
1
,
'replacement'
=>
1
]),
break
;
]];
case
'updateMany'
:
case
'updateOne'
:
case
'updateMany'
:
$options
=
array_diff_key
(
$request
[
'arguments'
],
[
'filter'
=>
1
,
'update'
=>
1
]);
case
'updateOne'
:
$innerArray
=
[
$request
[
'arguments'
][
'filter'
],
$request
[
'arguments'
][
'update'
],
$options
];
return
[
$request
[
'name'
]
=>
[
break
;
$request
[
'arguments'
][
'filter'
],
default
:
$request
[
'arguments'
][
'update'
],
throw
new
LogicException
(
'Unsupported bulk write request: '
.
$request
[
'name'
]);
array_diff_key
(
$request
[
'arguments'
],
[
'filter'
=>
1
,
'update'
=>
1
]),
}
]];
$operations
[]
=
[
$request
[
'name'
]
=>
$innerArray
];
default
:
throw
new
LogicException
(
'Unsupported bulk write request: '
.
$request
[
'name'
]);
}
}
return
$operations
;
}
}
/**
/**
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment