private void when_deploy_a_snapshot_step()
        {
            act = () => { _deployer.Deploy(_step, _environmentId); };

            context["and task executed successfully"] = () =>
            {
                before = () =>
                {
                    _task = new TaskResource {
                        State = TaskState.Success
                    };
                    A.CallTo(() => _taskFactory.Create(A <SnapshotStep> ._, A <string> ._)).Returns(_task);
                    A.CallTo(() => _taskWaiter.Wait(A <TaskResource> ._)).Returns(_task);
                };

                it["should create a task"] =
                    () => { A.CallTo(() => _taskFactory.Create(_step, _environmentId)).MustHaveHappened(); };

                it["should wait for task to complete"] =
                    () => { A.CallTo(() => _taskWaiter.Wait(_task)).MustHaveHappened(); };
            };

            context["and task failed to execute"] = () =>
            {
                before = () =>
                {
                    A.CallTo(() => _taskFactory.Create(A <SnapshotStep> ._, A <string> ._)).Returns(null);

                    var taskResource = new TaskResource {
                        State = TaskState.Failed
                    };
                    A.CallTo(() => _taskWaiter.Wait(A <TaskResource> ._)).Returns(taskResource);
                };

                it["should throw index out of range exception"] = expect <IndexOutOfRangeException>();
            };
        }
        public void Deploy(SnapshotStep step, string environmentId)
        {
            Log.Info($"Deployment step {step.Index} project {step.ProjectName} version {step.ReleaseVersion}. Started.");

            var task = _taskResources.Create(step, environmentId);

            task = _executedTaskResources.Wait(task);

            Log.Debug("Validating deployment task state..");

            if (task.State != TaskState.Success)
            {
                var message = $"Deployment task for project {step.ProjectName} finished with {task.State} state.";
                throw new IndexOutOfRangeException(message);
            }

            Log.Info($"Deployment step {step.Index} project {step.ProjectName} version {step.ReleaseVersion}. Finished.");
        }