diff --git a/splitio_platform_interface/lib/split_configuration.dart b/splitio_platform_interface/lib/split_configuration.dart index 1d54fdd..c742c48 100644 --- a/splitio_platform_interface/lib/split_configuration.dart +++ b/splitio_platform_interface/lib/split_configuration.dart @@ -1,4 +1,5 @@ import 'package:splitio_platform_interface/split_certificate_pinning_configuration.dart'; +import 'package:splitio_platform_interface/split_fallback_treatments_configuration.dart'; import 'package:splitio_platform_interface/split_sync_config.dart'; import 'package:splitio_platform_interface/split_rollout_cache_configuration.dart'; @@ -48,6 +49,10 @@ class SplitConfiguration { /// [readyTimeout] Maximum amount of time in seconds to wait before firing the SDK_READY_TIMED_OUT event. Defaults to 10 seconds. /// /// [certificatePinningConfiguration] Certificate pinning configuration. Pins need to have the format of a base64 SHA-256 or base64 SHA-1 hashes of the SPKI (ex.: "sha256/7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y="). Not supported in Web. + /// + /// [rolloutCacheConfiguration] Rollout cache configuration. + /// + /// [fallbackTreatments] Fallback treatments configuration. SplitConfiguration({ int? featuresRefreshRate, int? segmentsRefreshRate, @@ -76,6 +81,7 @@ class SplitConfiguration { int? readyTimeout = 10, CertificatePinningConfiguration? certificatePinningConfiguration, RolloutCacheConfiguration? rolloutCacheConfiguration, + FallbackTreatmentsConfiguration? fallbackTreatments, }) { if (featuresRefreshRate != null) { configurationMap['featuresRefreshRate'] = featuresRefreshRate; @@ -195,6 +201,13 @@ class SplitConfiguration { 'clearOnInit': rolloutCacheConfiguration.clearOnInit }; } + + if (fallbackTreatments != null) { + configurationMap['fallbackTreatments'] = { + 'global': fallbackTreatments.global, + 'byFlag': fallbackTreatments.byFlag + }; + } } } diff --git a/splitio_platform_interface/lib/split_fallback_treatment.dart b/splitio_platform_interface/lib/split_fallback_treatment.dart new file mode 100644 index 0000000..bb52ed9 --- /dev/null +++ b/splitio_platform_interface/lib/split_fallback_treatment.dart @@ -0,0 +1,6 @@ +class FallbackTreatment { + final String treatment; + final String? config; + + const FallbackTreatment(this.treatment, [this.config]); +} diff --git a/splitio_platform_interface/lib/split_fallback_treatments_configuration.dart b/splitio_platform_interface/lib/split_fallback_treatments_configuration.dart new file mode 100644 index 0000000..d3c3c8d --- /dev/null +++ b/splitio_platform_interface/lib/split_fallback_treatments_configuration.dart @@ -0,0 +1,18 @@ +import 'package:splitio_platform_interface/split_fallback_treatment.dart'; + +class FallbackTreatmentsConfiguration { + Map? _global; + Map>? _byFlag; + + Map? get global => _global; + Map>? get byFlag => _byFlag; + + FallbackTreatmentsConfiguration( + {FallbackTreatment? global, Map? byFlag}) { + _global = global != null + ? {'treatment': global.treatment, 'config': global.config} + : null; + _byFlag = byFlag?.map((key, value) => + MapEntry(key, {'treatment': value.treatment, 'config': value.config})); + } +} diff --git a/splitio_platform_interface/test/split_fallback_treatments_configuration_test.dart b/splitio_platform_interface/test/split_fallback_treatments_configuration_test.dart new file mode 100644 index 0000000..2dd3990 --- /dev/null +++ b/splitio_platform_interface/test/split_fallback_treatments_configuration_test.dart @@ -0,0 +1,39 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:splitio_platform_interface/split_fallback_treatment.dart'; +import 'package:splitio_platform_interface/split_fallback_treatments_configuration.dart'; + +void main() { + test('global and by flag fallback treatments', () { + var config = FallbackTreatmentsConfiguration( + global: const FallbackTreatment('custom-treatment')); + + expect(config.global, + equals({'treatment': 'custom-treatment', 'config': null})); + expect(config.byFlag, null); + + config = FallbackTreatmentsConfiguration(byFlag: { + 'flag1': const FallbackTreatment('custom-treatment-1', 'custom-config-1'), + 'flag2': const FallbackTreatment('custom-treatment-2', 'custom-config-2') + }); + expect( + config.byFlag, + equals({ + 'flag1': { + 'treatment': 'custom-treatment-1', + 'config': 'custom-config-1' + }, + 'flag2': { + 'treatment': 'custom-treatment-2', + 'config': 'custom-config-2' + } + })); + expect(config.global, null); + }); + + test('default values', () { + var config = FallbackTreatmentsConfiguration(); + + expect(config.global, null); + expect(config.byFlag, null); + }); +} diff --git a/splitio_platform_interface/test/splitio_configuration_test.dart b/splitio_platform_interface/test/splitio_configuration_test.dart index 64b758c..c627edb 100644 --- a/splitio_platform_interface/test/splitio_configuration_test.dart +++ b/splitio_platform_interface/test/splitio_configuration_test.dart @@ -1,6 +1,8 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:splitio_platform_interface/split_certificate_pinning_configuration.dart'; import 'package:splitio_platform_interface/split_configuration.dart'; +import 'package:splitio_platform_interface/split_fallback_treatment.dart'; +import 'package:splitio_platform_interface/split_fallback_treatments_configuration.dart'; import 'package:splitio_platform_interface/split_rollout_cache_configuration.dart'; import 'package:splitio_platform_interface/split_sync_config.dart'; @@ -36,7 +38,16 @@ void main() { .addPin('host1', 'pin1') .addPin('host2', 'pin3') .addPin('host1', 'pin2'), - rolloutCacheConfiguration: RolloutCacheConfiguration(expirationDays: 15, clearOnInit: true)); + rolloutCacheConfiguration: + RolloutCacheConfiguration(expirationDays: 15, clearOnInit: true), + fallbackTreatments: FallbackTreatmentsConfiguration( + global: const FallbackTreatment('custom-treatment'), + byFlag: { + 'flag1': const FallbackTreatment( + 'custom-treatment-flag1', 'config-flag1'), + 'flag2': const FallbackTreatment('custom-treatment-flag2'), + }, + )); expect(config.configurationMap['eventFlushInterval'], 2000); expect(config.configurationMap['eventsPerPush'], 300); @@ -73,8 +84,22 @@ void main() { 'host1': ['pin1', 'pin2'], 'host2': ['pin3'] }); - expect(config.configurationMap['rolloutCacheConfiguration']['expirationDays'], 15); - expect(config.configurationMap['rolloutCacheConfiguration']['clearOnInit'], true); + expect( + config.configurationMap['rolloutCacheConfiguration']['expirationDays'], + 15); + expect(config.configurationMap['rolloutCacheConfiguration']['clearOnInit'], + true); + expect(config.configurationMap['fallbackTreatments']['global'], + equals({'treatment': 'custom-treatment', 'config': null})); + expect( + config.configurationMap['fallbackTreatments']['byFlag'], + equals({ + 'flag1': { + 'treatment': 'custom-treatment-flag1', + 'config': 'config-flag1' + }, + 'flag2': {'treatment': 'custom-treatment-flag2', 'config': null} + })); }); test('no special values leaves map empty', () async {