Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Why flush is necesary on methods like grabFromRepository? #13

Open
reypm opened this issue Jul 1, 2020 · 2 comments
Open

Why flush is necesary on methods like grabFromRepository? #13

reypm opened this issue Jul 1, 2020 · 2 comments

Comments

@reypm
Copy link

reypm commented Jul 1, 2020

I have configured Doctrine2 and Symfony modules as follow:

modules:
    enabled:
        - Symfony:
              app_path: 'src'
              environment: 'test'
        - Doctrine2:
              depends: Symfony
              cleanup: true

and I have created a helper to be used as part of my Functional tests as follow (snippet with relevant parts only):

public function grabWorkableEntityForCase(int $schemeID = CcType::VISA, ?int $cId = null): Cases
{
    /** @var Cases $caseEntity */
    $caseEntity = $this->grabEntityFromRepository(Cases::class, [
        'ccType' => $schemeID, 
        (new Criteria())->orderBy(['id' => Criteria::DESC])->setMaxResults(1)
    ]);
    
    // If we need an specific Case just override the previous value
    if (null !== $cId) {
        $caseEntity = $this->grabEntityFromRepository(Cases::class, ['id' => $cId]);
    }
    
    // Unlock it
    $caseEntity->removeLock();
    
    //Grab dispute cycle RFI
    $disputeCycle = $this->grabEntityFromRepository(DisputeCycle::class, ['id' => DisputeCycle::RETRIEVAL]);
    $functionalCode = $this->grabEntityFromRepository(FunctionCode::class, [
        'disputeCycle' => $disputeCycle, 
        (new Criteria())->orderBy(['id' => Criteria::DESC])->setMaxResults(1)
    ]);
    
    // And assigned to a worker if need be otherwise use always a random user
    if (null !== $userID) {
        $user = $this->grabEntityFromRepository(User::class, ['id' => $userID]);
    } else {
        $user = $this->grabWorkableUserEntity();
    }
    
    $caseEntity->setUser($user);
    
    $this->haveInRepository($caseEntity);
    
    return $caseEntity;
}

from my test the code above is being called as:

public function _before(FunctionalTester $I)
{
    $this->user = $I->grabWorkableUserEntity();
    $this->case = $I->grabWorkableEntityForCase();
    $I->flushAllTables(false, $this->case->getId());
}

But I end up with the following error:

1) WriteOffOutcomeFunctionalCest: Will record and send fee collection
 Test  tests/functional/FullWriteOffOutcomeFunctionalCest.php:willRecordAndSendFeeCollection

  [Doctrine\DBAL\ConnectionException] Transaction commit failed because the transaction has been marked for rollback only.

Scenario Steps:

 15. $I->grabEntityFromRepository("App\Entity\DisputeCycle",{"id":1}) at tests/_support/Base/BaseActor.php:193
 14. $I->grabEntityFromRepository("App\Entity\Cases",{"ccType":1,"0":"Doctrine\\Common\\Collections\\Criteria"}) at tests/_support/Base/BaseActor.php:164
 13. $I->emptyTable("App\Entity\StatusHist",38613) at tests/_support/Base/BaseActor.php:405
 12. $I->emptyTable("App\Entity\ProcessingOutcome",38613) at tests/_support/Base/BaseActor.php:387
 11. $I->emptyTable("App\Entity\DisputeResponse",38613) at tests/_support/Base/BaseActor.php:396
 10. $I->emptyTable("App\Entity\EventsHistory",38613) at tests/_support/Base/BaseActor.php:423

from the error above lines 193 is:

$disputeCycle = $this->grabEntityFromRepository(DisputeCycle::class, ['id' => DisputeCycle::RETRIEVAL]);

I am not sure if the flush inside grabEntitiesFromRepository method is what is causing this or what could be the reason of it, true story is that I have been trying to debug this for hours without success so any help is more than welcome. What I am a missing here?

@ThomasLandauer
Copy link
Member

Here's a related issue: https://github.com/Codeception/Codeception/issues/5439
And I just suggested to deprecate grabEntityFromRepository() altogether, and just inject Doctrine's Repository instead: Codeception/module-doctrine2#22

@ThomasLandauer
Copy link
Member

Because of this flush() problem, I added a recommendation for Symfony users to use the "built-in" repository, instead of this module's grab...() methods: https://codeception.com/docs/modules/Doctrine2#Grabbing-Entities-with-Symfony
This is at least a step forward for most users...
So I think this issue can be closed.

@TavoNiievez TavoNiievez transferred this issue from Codeception/module-doctrine2 Feb 17, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants