Skip to content

Commit

Permalink
Feature: Add Beta Feature Flags (#7242)
Browse files Browse the repository at this point in the history
  • Loading branch information
kjohnson authored Feb 23, 2024
1 parent 4174c32 commit cb8df82
Show file tree
Hide file tree
Showing 8 changed files with 185 additions and 0 deletions.
1 change: 1 addition & 0 deletions give.php
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,7 @@ final class Give
//TODO: merge this service provider
Give\PaymentGateways\Gateways\ServiceProvider::class,
Give\EventTickets\ServiceProvider::class,
Give\BetaFeatures\ServiceProvider::class,
];

/**
Expand Down
15 changes: 15 additions & 0 deletions src/BetaFeatures/Actions/RegisterSettingSection.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace Give\BetaFeatures\Actions;

/**
* @unreleased
*/
class RegisterSettingSection
{
public function __invoke($sections)
{
$sections['beta'] = __('Beta Features', 'give');
return $sections;
}
}
40 changes: 40 additions & 0 deletions src/BetaFeatures/Actions/RegisterSettings.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace Give\BetaFeatures\Actions;

/**
* @unreleased
*/
class RegisterSettings
{
public function __invoke($settings)
{
if('beta' !== give_get_current_setting_section()) {
return $settings;
}

return $this->getSettings();
}

protected function getSettings()
{
return [
['id' => 'give_title_beta_features_1', 'type' => 'title'],
[
'name' => __('Event Tickets', 'give'),
'desc' => __(
'If enabled, you’ll be get access to the event tickets feature where you can create and manage events, and link them to your donation form. Since this is in a beta, your feedback is crucial to help us improve and make the experience better before making it public.',
'give'
),
'id' => 'enable_event_tickets',
'type' => 'radio_inline',
'default' => 'enabled',
'options' => [
'enabled' => __('Enabled', 'give'),
'disabled' => __('Disabled', 'give'),
],
],
['id' => 'give_title_beta_features_2', 'type' => 'sectionend'],
];
}
}
17 changes: 17 additions & 0 deletions src/BetaFeatures/Facades/FeatureFlag.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace Give\BetaFeatures\Facades;

use Give\Framework\Support\Facades\Facade;

/**
* @method static bool eventTickets()
* @method static bool enabled(string $feature)
*/
class FeatureFlag extends Facade
{
protected function getFacadeAccessor()
{
return \Give\BetaFeatures\Repositories\FeatureFlagRepository::class;
}
}
22 changes: 22 additions & 0 deletions src/BetaFeatures/Repositories/FeatureFlagRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace Give\BetaFeatures\Repositories;

class FeatureFlagRepository
{
public function eventTickets(): bool
{
return $this->enabled('event_tickets', true);
}

public function enabled($feature, $default = false): bool
{
// Workaround so that the updated option is available at the start of the request.
$option = isset($_POST["enable_$feature"])
? give_clean($_POST["enable_$feature"])
: give_get_option("enable_$feature", $default);

return give_is_setting_enabled($option);

}
}
31 changes: 31 additions & 0 deletions src/BetaFeatures/ServiceProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace Give\BetaFeatures;

use Give\Helpers\Hooks;
use Give\ServiceProviders\ServiceProvider as ServiceProviderInterface;

/**
* @unreleased
*/
class ServiceProvider implements ServiceProviderInterface
{
/**
* @unreleased
* @inheritDoc
*/
public function register(): void
{
//
}

/**
* @unreleased
* @inheritDoc
*/
public function boot(): void
{
Hooks::addFilter('give_get_settings_general', Actions\RegisterSettings::class);
Hooks::addFilter('give_get_sections_general', Actions\RegisterSettingSection::class);
}
}
9 changes: 9 additions & 0 deletions src/EventTickets/ServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Give\EventTickets;

use Give\BetaFeatures\Facades\FeatureFlag;
use Give\EventTickets\Hooks\DonationFormBlockRender;
use Give\EventTickets\Repositories\EventRepository;
use Give\EventTickets\Repositories\EventTicketRepository;
Expand All @@ -21,6 +22,10 @@ class ServiceProvider implements ServiceProviderInterface
*/
public function register(): void
{
if( ! FeatureFlag::eventTickets() ) {
return;
}

global $wpdb;
$wpdb->give_events = "{$wpdb->prefix}give_events";
$wpdb->give_event_tickets = "{$wpdb->prefix}give_event_tickets";
Expand All @@ -37,6 +42,10 @@ public function register(): void
*/
public function boot(): void
{
if( ! FeatureFlag::eventTickets() ) {
return;
}

give( MigrationsRegister::class )->addMigrations([
Migrations\CreateEventsTable::class,
Migrations\CreateEventTicketTypesTable::class,
Expand Down
50 changes: 50 additions & 0 deletions tests/Unit/BetaFeatures/Repositories/FeatureFlagRepositoryTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?php

namespace Give\Tests\Unit\BetaFeatures\Repositories;

use Give\BetaFeatures\Facades\FeatureFlag;
use Give\Tests\TestCase;
use Give\Tests\TestTraits\RefreshDatabase;

class FeatureFlagRepositoryTest extends TestCase
{
use RefreshDatabase;

public function testEventTicketsShouldBeEnabledByDefault()
{
$this->assertTrue(FeatureFlag::eventTickets());
}

public function testShouldReturnDisabledWhenNotSet()
{
$this->assertFalse(FeatureFlag::enabled('my_feature'));
}

public function testShouldReturnDisabledWhenNotEnabled()
{
give_update_option('enable_my_feature', false);

$this->assertFalse(FeatureFlag::enabled('my_feature'));
}

public function testShouldReturnEnabledWhenEnabled()
{
give_update_option('enable_my_feature', true);

$this->assertTrue(FeatureFlag::enabled('my_feature'));
}

public function testShouldReturnDisabledWhenSetInGlobal()
{
$_POST['enable_my_feature'] = 'disabled';

$this->assertFalse(FeatureFlag::enabled('my_feature'));
}

public function testShouldReturnEnabledWhenSetInGlobal()
{
$_POST['enable_my_feature'] = 'enabled';

$this->assertTrue(FeatureFlag::enabled('my_feature'));
}
}

0 comments on commit cb8df82

Please sign in to comment.