public async Task GetOrganizationApiKey_HasTwo_Throws(SutProvider <GetOrganizationApiKeyCommand> sutProvider,
                                                              Guid organizationId, OrganizationApiKeyType keyType)
        {
            sutProvider.GetDependency <IOrganizationApiKeyRepository>()
            .GetManyByOrganizationIdTypeAsync(organizationId, keyType)
            .Returns(new List <OrganizationApiKey>
            {
                new OrganizationApiKey
                {
                    Id             = Guid.NewGuid(),
                    OrganizationId = organizationId,
                    ApiKey         = "test",
                    Type           = keyType,
                    RevisionDate   = DateTime.Now.AddDays(-1),
                },
                new OrganizationApiKey
                {
                    Id             = Guid.NewGuid(),
                    OrganizationId = organizationId,
                    ApiKey         = "test_other",
                    Type           = keyType,
                    RevisionDate   = DateTime.Now.AddDays(-1),
                },
            });

            await Assert.ThrowsAsync <InvalidOperationException>(
                async() => await sutProvider.Sut.GetOrganizationApiKeyAsync(organizationId, keyType));
        }
        public async Task GetOrganizationApiKey_BadType_Throws(SutProvider <GetOrganizationApiKeyCommand> sutProvider,
                                                               Guid organizationId, OrganizationApiKeyType keyType)
        {
            keyType = (OrganizationApiKeyType)byte.MaxValue;

            await Assert.ThrowsAsync <ArgumentOutOfRangeException>(
                async() => await sutProvider.Sut.GetOrganizationApiKeyAsync(organizationId, keyType));
        }
        public async Task <OrganizationApiKey> GetOrganizationApiKeyAsync(Guid organizationId, OrganizationApiKeyType organizationApiKeyType)
        {
            if (!Enum.IsDefined(organizationApiKeyType))
            {
                throw new ArgumentOutOfRangeException(nameof(organizationApiKeyType), $"Invalid value for enum {nameof(OrganizationApiKeyType)}");
            }

            var apiKeys = await _organizationApiKeyRepository
                          .GetManyByOrganizationIdTypeAsync(organizationId, organizationApiKeyType);

            if (apiKeys == null || !apiKeys.Any())
            {
                var apiKey = new OrganizationApiKey
                {
                    OrganizationId = organizationId,
                    Type           = organizationApiKeyType,
                    ApiKey         = CoreHelpers.SecureRandomString(30),
                    RevisionDate   = DateTime.UtcNow,
                };

                await _organizationApiKeyRepository.CreateAsync(apiKey);

                return(apiKey);
            }

            // NOTE: Currently we only allow one type of api key per organization
            return(apiKeys.Single());
        }
        public async Task GetOrganizationApiKey_HasNone_CreatesAndReturns(SutProvider <GetOrganizationApiKeyCommand> sutProvider,
                                                                          Guid organizationId, OrganizationApiKeyType keyType)
        {
            sutProvider.GetDependency <IOrganizationApiKeyRepository>()
            .GetManyByOrganizationIdTypeAsync(organizationId, keyType)
            .Returns(Enumerable.Empty <OrganizationApiKey>());

            var apiKey = await sutProvider.Sut.GetOrganizationApiKeyAsync(organizationId, keyType);

            Assert.NotNull(apiKey);
            Assert.Equal(organizationId, apiKey.OrganizationId);
            Assert.Equal(keyType, apiKey.Type);
            await sutProvider.GetDependency <IOrganizationApiKeyRepository>()
            .Received(1)
            .CreateAsync(Arg.Any <OrganizationApiKey>());
        }
        public async Task GetOrganizationApiKey_HasOne_Returns(SutProvider <GetOrganizationApiKeyCommand> sutProvider,
                                                               Guid id, Guid organizationId, OrganizationApiKeyType keyType)
        {
            sutProvider.GetDependency <IOrganizationApiKeyRepository>()
            .GetManyByOrganizationIdTypeAsync(organizationId, keyType)
            .Returns(new List <OrganizationApiKey>
            {
                new OrganizationApiKey
                {
                    Id             = id,
                    OrganizationId = organizationId,
                    ApiKey         = "test",
                    Type           = keyType,
                    RevisionDate   = DateTime.Now.AddDays(-1),
                },
            });

            var apiKey = await sutProvider.Sut.GetOrganizationApiKeyAsync(organizationId, keyType);

            Assert.NotNull(apiKey);
            Assert.Equal(id, apiKey.Id);
        }