Skip to content

[Feature Request] Set the expectCompletion result for each Activity call inside the loop #302

Open
@num213

Description

Is your feature request related to a problem? Please describe.

For PHP-SDK we can use ActivityMocker and expectCompletion() to mock an activity call result. And it works great if we don't call the activity inside the loop.

If we call it inside the loop than we can't set expectCompletion() for each of the Activity call inside the loop.

For example consider we have the following phpunit test:

public function testWorkflowSend()
{
    $workflow = $this->workflowClient->newWorkflowStub(SomeWorkflow::class);
    $run = $this->workflowClient->start($workflow, ['value1', 'value2', 'value3']);
    $this->assertSame(['someResult1', 'someResult2', 'someResult3'], $run->getResult('array'));
}

The workflow method:

public function send(array $values)
{
    $results = [];
    foreach ($values as $value) {
        $results[] = yield $this->activity->doSomething($value);
    }
    return $results;
}

And we want to mock the activity calls like this:

$this->activityMocks->expectCompletion(
    'SomeActivity.doSomething', ['someResult1', 'someResult2', 'someResult3']
);

The result of running the workflow inside this test will be:

array(3) {
[0] => array(3) {
    [0] => string(11) "someResult1",
    [1] => string(11) "someResult2",
    [2] => string(11) "someResult3",
}, 
[1] => array(3) {
    [0] => string(11) "someResult1",
    [1] => string(11) "someResult2",
    [2] => string(11) "someResult3",
}, 
[2] => array(3) {
    [0] => string(11) "someResult1",
    [1] => string(11) "someResult2",
    [2] => string(11) "someResult3",
}

Instead of:

array(9) {
    [0] => string(11) "someResult1",
    [1] => string(11) "someResult2",
    [2] => string(11) "someResult3",
}

Even if we mock the activity calls like this:

$this->activityMocks->expectCompletion('SomeActivity.doSomething', 'someResult1');
$this->activityMocks->expectCompletion('SomeActivity.doSomething', 'someResult2');
$this->activityMocks->expectCompletion('SomeActivity.doSomething', 'someResult3');

The result will be:

array(9) {
    [0] => string(11) "someResult3",
    [1] => string(11) "someResult3",
    [2] => string(11) "someResult3",
}

Describe the solution you'd like

It will be great if we have a choice to set expectCompletion result for each call of the Activity inside the loop. For example:

$this->activityMocks->expectCompletion(
    'SomeActivity.doSomething', 'someResult1', 1
); // for the first call

$this->activityMocks->expectCompletion(
    'SomeActivity.doSomething', 'someResult2', 2
); // for the second

$this->activityMocks->expectCompletion(
    'SomeActivity.doSomething', 'someResult3', 3
); // for the third

And the same with expectFailure():

$this->activityMocks->expectCompletion(
    'SomeActivity.doSomething', 'someResult1', 1
); // for the first call
$this->activityMocks->expectFailure(
    'SomeActivity.doSomething', new Error(), 2
); // except error for the second call

Metadata

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions