getMockBuilder( User::class ) ->onlyMethods( [ 'pingLimiter' ] ) ->getMock(); $user->expects( $this->exactly( 3 ) ) ->method( 'pingLimiter' ) ->withConsecutive( [ 'edit', 1 ], [ 'linkpurge', 0 ], [ 'editcontentmodel', 1 ] ) ->willReturnOnConsecutiveCalls( false, false, false ); $title = $this->createMock( Title::class ); $title->expects( $this->once() ) ->method( 'getContentModel' ) ->willReturn( 'OldContentModel' ); $constraint = new UserRateLimitConstraint( $user, $title, 'NewContentModel' ); $this->assertConstraintPassed( $constraint ); } public function testFailure() { // Cannot assert that 0 parameters are passed, since PHP fills in the default // values before PHPUnit checks; first call uses both defaults, third call // uses the default of 1 for the second parameter $user = $this->getMockBuilder( User::class ) ->onlyMethods( [ 'pingLimiter' ] ) ->getMock(); $user->expects( $this->exactly( 3 ) ) ->method( 'pingLimiter' ) ->withConsecutive( [ 'edit', 1 ], [ 'linkpurge', 0 ], [ 'editcontentmodel', 1 ] ) ->willReturnOnConsecutiveCalls( false, false, true // Only die on the last check ); $title = $this->createMock( Title::class ); $title->expects( $this->once() ) ->method( 'getContentModel' ) ->willReturn( 'OldContentModel' ); $constraint = new UserRateLimitConstraint( $user, $title, 'NewContentModel' ); $this->assertConstraintFailed( $constraint, IEditConstraint::AS_RATE_LIMITED ); } }