Skip to content

Add rate limit factory interface #46645

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

Conversation

nathansalter
Copy link

Q A
Branch? 6.2
Bug fix? no
New feature? yes
Deprecations? no
Tickets Fix #46644
License MIT
Doc PR symfony/symfony-docs#16867

Adding a RateLimitFactoryInterface so that alternative limiters can be used, or for its use in UnitTests. Extension can be done using the decorator pattern with this PR.

@carsonbot
Copy link

Hey!

I see that this is your first PR. That is great! Welcome!

Symfony has a contribution guide which I suggest you to read.

In short:

  • Always add tests
  • Keep backward compatibility (see https://symfony.com/bc).
  • Bug fixes must be submitted against the lowest maintained branch where they apply (see https://symfony.com/releases)
  • Features and deprecations must be submitted against the 6.2 branch.

Review the GitHub status checks of your pull request and try to solve the reported issues. If some tests are failing, try to see if they are failing because of this change.

When two Symfony core team members approve this change, it will be merged and you will become an official Symfony contributor!
If this PR is merged in a lower version branch, it will be merged up to all maintained branches within a few days.

I am going to sit back now and wait for the reviews.

Cheers!

Carsonbot

@nathansalter nathansalter force-pushed the add-rate-limit-factory-interface branch from 971f19b to ecd611c Compare June 11, 2022 08:29
Adds an interface for the `RateLimitFactory` to allow alternative
integrations or use in unit tests. See Issue symfony#46644
@nathansalter nathansalter force-pushed the add-rate-limit-factory-interface branch from ecd611c to 4d7ab84 Compare June 11, 2022 08:31
@wouterj
Copy link
Member

wouterj commented Jun 11, 2022

Hi there! I'm very happy to see that you followed the contribution guide and did such a complete contribution. However, this change has been rejected before already and I don't think the situation has changed now: #39634, #40391

You don't need to mock the RateLimiterFactory in order to write unit tests. In fact, mocking a factory class often results in increased maintenance costs with little gain. You can see an example on how to use the factory in a unit test in Symfony's code:

$localLimiter = new RateLimiterFactory([
'id' => 'login',
'policy' => 'fixed_window',
'limit' => 3,
'interval' => '1 minute',
], new InMemoryStorage());
This uses InMemoryStorage and no limiter instead of mocking. Using these special implementations of the interface instead of mocking them often leads to more maintainable tests.

More information about this methodology of writing tests can be found in e.g. this blog post: https://blog.frankdejonge.nl/testing-without-mocking-frameworks/

If you have any other comments or questions, feel free to leave a comment :)

@nathansalter
Copy link
Author

This uses InMemoryStorage and no limiter instead of mocking.

Ah perfect, I hadn't realised this! I probably should have searched a bit more thoroughly for those issues, I'll close this PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[RateLimiter] final class Factory does not implement an interface
3 participants