using Bit.Core.Platform.Push; using Bit.Core.Platform.PushRegistration.Internal; using Bit.Core.Repositories; using Bit.Core.Repositories.Noop; using Bit.Core.Settings; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Xunit; namespace Bit.Core.Test.Platform.PushRegistration; public class PushRegistrationServiceCollectionExtensionsTests { [Fact] public void AddPushRegistration_Cloud_CreatesNotificationHubRegistrationService() { var services = Build(new Dictionary { { "GlobalSettings:SelfHosted", "false" }, }); var pushRegistrationService = services.GetRequiredService(); Assert.IsType(pushRegistrationService); } [Fact] public void AddPushRegistration_SelfHosted_NoOtherConfig_ReturnsNoopRegistrationService() { var services = Build(new Dictionary { { "GlobalSettings:SelfHosted", "true" }, }); var pushRegistrationService = services.GetRequiredService(); Assert.IsType(pushRegistrationService); } [Fact] public void AddPushRegistration_SelfHosted_RelayConfig_ReturnsRelayRegistrationService() { var services = Build(new Dictionary { { "GlobalSettings:SelfHosted", "true" }, { "GlobalSettings:PushRelayBaseUri", "https://example.com" }, { "GlobalSettings:Installation:Key", "some_key" }, }); var pushRegistrationService = services.GetRequiredService(); Assert.IsType(pushRegistrationService); } [Fact] public void AddPushRegistration_MultipleTimes_NoAdditionalServices() { var services = new ServiceCollection(); var config = new Dictionary { { "GlobalSettings:SelfHosted", "true" }, { "GlobalSettings:PushRelayBaseUri", "https://example.com" }, { "GlobalSettings:Installation:Key", "some_key" }, }; AddServices(services, config); // Add services again services.AddPushRegistration(); var provider = services.BuildServiceProvider(); Assert.Single(provider.GetServices()); } private static ServiceProvider Build(Dictionary initialData) { var services = new ServiceCollection(); AddServices(services, initialData); return services.BuildServiceProvider(); } private static void AddServices(IServiceCollection services, Dictionary initialData) { // A minimal service collection is always expected to have logging, config, and global settings // pre-registered. services.AddLogging(); var config = new ConfigurationBuilder() .AddInMemoryCollection(initialData) .Build(); services.TryAddSingleton(config); var globalSettings = new GlobalSettings(); config.GetSection("GlobalSettings").Bind(globalSettings); services.TryAddSingleton(globalSettings); services.TryAddSingleton(globalSettings); // Temporary until AddPushRegistration can add it themselves directly. services.TryAddSingleton(); services.AddPushRegistration(); } }