public function test_defer() { $resolver = new IdResolver(); $fooRepository = Mockery::mock("Prewk\\Seriplating\\Contracts\\RepositoryInterface"); $barRepository = Mockery::mock("Prewk\\Seriplating\\Contracts\\RepositoryInterface"); $resolver->bind("foos_0", 1); $resolver->defer("bars_2", $fooRepository, 1, "data.bars.0.bar_id"); $resolver->defer("bars_3", $fooRepository, 1, "data.bars.1.bar_id"); $resolver->bind("foos_1", 2); $resolver->bind("bars_2", 3); $resolver->defer("foos_0", $barRepository, 3, "foo_id"); $resolver->bind("bars_3", 4); $resolver->defer("foos_1", $barRepository, 4, "foo_id"); $bar2Callbacked = false; $bar3Callbacked = false; $somethingElseCallbacked = false; $resolver->onResolve("bars", function ($repo, $id, $barId) use($fooRepository, &$bar2Callbacked, &$bar3Callbacked, &$somethingElseCallbacked) { $this->assertEquals($fooRepository, $repo); if ($id === 1 && $barId === 3) { $bar2Callbacked = true; } else { if ($id === 1 && $barId === 4) { $bar3Callbacked = true; } else { $somethingElseCallbacked = true; } } }); $fooRepository->shouldReceive("update")->once()->with(1, ["data" => ["bars" => [["bar_id" => 3], ["bar_id" => 4]]]]); $barRepository->shouldReceive("update")->once()->with(3, ["foo_id" => 1])->shouldReceive("update")->once()->with(4, ["foo_id" => 2]); $resolver->resolve(); $this->assertTrue($bar2Callbacked); $this->assertTrue($bar3Callbacked); $this->assertFalse($somethingElseCallbacked); }