justReturn(Payment::METHOD_COMP); $settings = Mockery::mock(StudioSettings::class); $resolver = new BillingMethodResolver($settings); self::assertSame(Payment::METHOD_COMP, $resolver->resolve(5)); } public function testDefaultsToCardWhenStripeConfiguredAndCardChosen(): void { Functions\when('get_user_meta')->justReturn(''); $resolver = new BillingMethodResolver( $this->settings(Payment::METHOD_CARD, true) ); self::assertSame(Payment::METHOD_CARD, $resolver->resolve(5)); } public function testDefaultsToEtransferWhenStripeNotConfigured(): void { Functions\when('get_user_meta')->justReturn(''); $resolver = new BillingMethodResolver( $this->settings(Payment::METHOD_CARD, false) ); self::assertSame(Payment::METHOD_ETRANSFER, $resolver->resolve(5)); self::assertSame(Payment::METHOD_ETRANSFER, $resolver->defaultMethod()); } public function testEtransferDefaultHoldsEvenWhenStripeIsLive(): void { Functions\when('get_user_meta')->justReturn(''); $resolver = new BillingMethodResolver( $this->settings(Payment::METHOD_ETRANSFER, true) ); self::assertSame(Payment::METHOD_ETRANSFER, $resolver->resolve(5)); self::assertSame(Payment::METHOD_ETRANSFER, $resolver->defaultMethod()); } public function testPerStudentCardOverrideStillWinsUnderAnEtransferDefault(): void { // The trial path: the studio bills by e-transfer, one student is moved to // card to prove Stripe end to end. Functions\when('get_user_meta')->justReturn(Payment::METHOD_CARD); $resolver = new BillingMethodResolver( $this->settings(Payment::METHOD_ETRANSFER, true) ); self::assertSame(Payment::METHOD_CARD, $resolver->resolve(5)); } public function testInvalidOverrideFallsBackToDefault(): void { Functions\when('get_user_meta')->justReturn('bogus'); $resolver = new BillingMethodResolver( $this->settings(Payment::METHOD_CARD, true) ); self::assertSame(Payment::METHOD_CARD, $resolver->resolve(5)); } private function settings(string $default, bool $stripeConfigured): StudioSettings { $settings = Mockery::mock(StudioSettings::class); $settings->shouldReceive('defaultPaymentMethod')->andReturn($default); $settings->shouldReceive('isStripeConfigured')->andReturn($stripeConfigured); return $settings; } }