public async Task GetNextState_FromUnknownState_ThrowsException()
        {
            //Arrange
            var flow = new ProvisionInstanceStateFlow(
                "some-plan-id",
                new Dogger.Domain.Models.Instance()
            {
                Name = "some-instance-name"
            });

            var serviceProvider = TestServiceProviderFactory.CreateUsingStartup();
            var stateFactory    = new ProvisioningStateFactory(serviceProvider);

            var fakeState    = Substitute.For <IProvisioningState>();
            var fakeMediator = Substitute.For <IMediator>();

            //Act
            var exception = await Assert.ThrowsExceptionAsync <UnknownFlowStateException>(async() =>
                                                                                          await flow.GetNextStateAsync(new NextStateContext(
                                                                                                                           fakeMediator,
                                                                                                                           stateFactory,
                                                                                                                           fakeState)));

            //Assert
            Assert.IsNotNull(exception);
        }
        public async Task GetInitialState_ValuesGiven_TransfersValuesToInitialState()
        {
            //Arrange
            var flow = new ProvisionInstanceStateFlow(
                "some-plan-id",
                new Dogger.Domain.Models.Instance()
            {
                Name = "some-instance-name"
            });

            var serviceProvider = TestServiceProviderFactory.CreateUsingStartup();
            var stateFactory    = new ProvisioningStateFactory(serviceProvider);

            var fakeMediator = Substitute.For <IMediator>();

            //Act
            var state = await flow.GetInitialStateAsync(new InitialStateContext(
                                                            fakeMediator,
                                                            stateFactory)) as ICreateLightsailInstanceState;

            //Assert
            Assert.IsNotNull(state);

            Assert.AreEqual("some-plan-id", state.PlanId);
            Assert.AreEqual("some-instance-name", state.DatabaseInstance.Name);
        }
        public async Task GetNextState_FromCompleteInstanceSetupState_ReturnsNull()
        {
            //Arrange
            var flow = new ProvisionInstanceStateFlow(
                "some-plan-id",
                new Dogger.Domain.Models.Instance()
            {
                Name = "some-instance-name"
            });

            var serviceProvider = TestServiceProviderFactory.CreateUsingStartup();
            var stateFactory    = new ProvisioningStateFactory(serviceProvider);

            var fakeState    = Substitute.For <ICompleteInstanceSetupState>();
            var fakeMediator = Substitute.For <IMediator>();

            //Act
            var state = await flow.GetNextStateAsync(new NextStateContext(
                                                         fakeMediator,
                                                         stateFactory,
                                                         fakeState));

            //Assert
            Assert.IsNull(state);
        }
        public async Task GetNextState_FromCreateLightsailInstanceState_ReturnsInstallDockerOnInstanceStateWithValuesTransferred()
        {
            //Arrange
            var fakeUserId = Guid.NewGuid();

            var flow = new ProvisionInstanceStateFlow(
                "some-plan-id",
                new Dogger.Domain.Models.Instance()
            {
                Name = "some-instance-name"
            })
            {
                UserId = fakeUserId
            };

            var serviceProvider = TestServiceProviderFactory.CreateUsingStartup();
            var stateFactory    = new ProvisioningStateFactory(serviceProvider);

            var fakeMediator = Substitute.For <IMediator>();

            var fakeState = Substitute.For <ICreateLightsailInstanceState>();

            fakeState.CreatedLightsailInstance.Returns(new Instance()
            {
                PublicIpAddress = "127.0.0.1"
            });

            //Act
            var state = await flow.GetNextStateAsync(new NextStateContext(
                                                         fakeMediator,
                                                         stateFactory,
                                                         fakeState)) as IInstallSoftwareOnInstanceState;

            //Assert
            Assert.IsNotNull(state);

            Assert.AreEqual("127.0.0.1", state.IpAddress);
            Assert.AreEqual(fakeUserId, state.UserId);
        }