Beispiel #1
0
        public void CallingNextPhase_WithSeveralPhases_LastPhaseBegingOpen_WillReturnDataAvailable()
        {
            var sandboxWithoutPhase = new Sandbox()
            {
                PhaseHistory = new List <SandboxPhaseHistory>()
                {
                    new SandboxPhaseHistory()
                    {
                        Counter = 0, Phase = SandboxPhase.Open
                    },
                    new SandboxPhaseHistory()
                    {
                        Counter = 1, Phase = SandboxPhase.DataAvailable
                    },
                    new SandboxPhaseHistory()
                    {
                        Counter = 2, Phase = SandboxPhase.Open
                    },
                }
            };

            var nextPhaseOfSandbox = SandboxPhaseUtil.GetNextPhase(sandboxWithoutPhase);

            Assert.Equal(SandboxPhase.DataAvailable, nextPhaseOfSandbox);
        }
Beispiel #2
0
        public void CallingNextPhase_WithEmptyPhaseList_WillReturnDataAvailable()
        {
            var sandboxWithoutPhase = new Sandbox()
            {
                PhaseHistory = new List <SandboxPhaseHistory>()
                {
                }
            };
            var nextPhaseOfSandbox = SandboxPhaseUtil.GetNextPhase(sandboxWithoutPhase);

            Assert.Equal(SandboxPhase.DataAvailable, nextPhaseOfSandbox);
        }
Beispiel #3
0
        public void CallingNextPhase_WithLastPhaseBegingDataAvailable_WillThrow()
        {
            var sandboxWithoutPhase = new Sandbox()
            {
                PhaseHistory = new List <SandboxPhaseHistory>()
                {
                    new SandboxPhaseHistory()
                    {
                        Counter = 0, Phase = SandboxPhase.DataAvailable
                    }
                }
            };

            Assert.Throws <Exception>(() => SandboxPhaseUtil.GetNextPhase(sandboxWithoutPhase));
        }
Beispiel #4
0
        public async Task <SandboxDetails> MoveToNextPhaseAsync(int sandboxId, CancellationToken cancellation = default)
        {
            _logger.LogInformation(_sandboxNextPhaseEventId, "Sandbox {0}: Starting", sandboxId);

            SandboxPhaseHistory newestHistoryItem = null;

            bool dataMightHaveBeenChanged = false;

            try
            {
                var user = await _userService.GetCurrentUserAsync();

                var sandboxFromDb = await GetSandboxForPhaseShift(sandboxId);

                var currentPhaseItem = SandboxPhaseUtil.GetCurrentPhaseHistoryItem(sandboxFromDb);

                if (currentPhaseItem == null)
                {
                    SandboxPhaseUtil.InitiatePhaseHistory(sandboxFromDb, user);
                    currentPhaseItem = SandboxPhaseUtil.GetCurrentPhaseHistoryItem(sandboxFromDb);
                }

                var nextPhase = SandboxPhaseUtil.GetNextPhase(sandboxFromDb);

                await ValidatePhaseMoveThrowIfNot(sandboxFromDb, currentPhaseItem.Phase, nextPhase, cancellation);

                _logger.LogInformation(_sandboxNextPhaseEventId, "Sandbox {0}: Moving from {1} to {2}", sandboxId, currentPhaseItem.Phase, nextPhase);

                newestHistoryItem = new SandboxPhaseHistory()
                {
                    Counter = currentPhaseItem.Counter + 1, Phase = nextPhase, CreatedBy = user.UserName
                };
                dataMightHaveBeenChanged = true;
                sandboxFromDb.PhaseHistory.Add(newestHistoryItem);
                await _db.SaveChangesAsync();

                _logger.LogInformation(_sandboxNextPhaseEventId, "Sandbox {0}: Phase added to db. Proceeding to make data available", sandboxId);

                if (nextPhase == SandboxPhase.DataAvailable)
                {
                    await MakeDatasetsAvailable(sandboxFromDb, cancellation);
                }

                _logger.LogInformation(_sandboxNextPhaseEventId, "Sandbox {0}: Done", sandboxId);

                return(await GetSandboxDetailsInternalAsync(sandboxId));
            }
            catch (Exception ex)
            {
                _logger.LogWarning(_sandboxNextPhaseEventId, ex, "Sandbox {0}: Phase shift failed.", sandboxId);

                if (dataMightHaveBeenChanged)
                {
                    _logger.LogWarning(_sandboxNextPhaseEventId, ex, "Data might have been changed. Rolling back");
                    await MakeDatasetsUnAvailable(sandboxId);
                    await AttemptRollbackPhase(sandboxId, newestHistoryItem);
                }

                throw;
            }
        }
Beispiel #5
0
        public void CallingNextPhase_WithPhaseListBeingNull_WillThrow()
        {
            var sandboxWithoutPhase = new Sandbox();

            Assert.Throws <Exception>(() => SandboxPhaseUtil.GetNextPhase(sandboxWithoutPhase));
        }
Beispiel #6
0
 public void CallingNextPhase_WithNullArgument_WillThrow()
 {
     Assert.Throws <ArgumentNullException>(() => SandboxPhaseUtil.GetNextPhase(null));
 }