public void OnDeclineCallbackForPostCalloutRevertsActionSetsJobToCanceledAndUnlocksEntity() { Mock.Arrange(() => _entityController.LoadEntity(SAMPLE_ENTITY_URI)) .IgnoreInstance() .Returns(UPDATED_ENTITY) .MustBeCalled(); Mock.Arrange(() => _entityController.UpdateEntity(SAMPLE_ENTITY_URI, SAMPLE_ENTITY)) .IgnoreInstance() .OccursOnce(); Job updatedJob = null; Mock.Arrange(() => _coreService.Jobs) .IgnoreInstance() .ReturnsCollection(new List <Job>(new List <Job> { CreateJob(SAMPLE_ENTITY_URI.ToString(), false) })) .OccursOnce(); Mock.Arrange(() => _coreService.UpdateObject(Arg.IsAny <Job>())) .IgnoreInstance() .DoInstead((Job j) => { updatedJob = j; }) .OccursOnce(); Mock.Arrange(() => _coreService.SaveChanges()) .IgnoreInstance() .Occurs(2); var stateChangeLockToBeDeleted = CreateStateChangeLock(SAMPLE_ENTITY_URI); Mock.Arrange(() => _coreService.StateChangeLocks) .IgnoreInstance() .ReturnsCollection(new List <StateChangeLock>(new List <StateChangeLock> { stateChangeLockToBeDeleted })) .InSequence() .MustBeCalled(); Mock.Arrange(() => _coreService.DeleteObject(stateChangeLockToBeDeleted)) .IgnoreInstance() .OccursOnce(); var lifeCycleManager = new LifeCycleManager(_authenticationProvider, ENTITY_TYPE); lifeCycleManager.OnDeclineCallback(CreateJob(SAMPLE_ENTITY_URI.ToString(), false)); Assert.AreEqual(JobStateEnum.Canceled.ToString(), updatedJob.State); Mock.Assert(_coreService); Mock.Assert(_entityController); }
public void OnAllowCallback(Job job) { var parameters = JsonConvert.DeserializeObject <CalloutData>(job.Parameters); var entityUri = new Uri(job.ReferencedItemId); ChangeJobState(job.Token, JobStateEnum.Finished); if (parameters.Type == Model.CalloutDefinition.CalloutDefinitionType.Pre.ToString()) { Debug.WriteLine("Process allow POST action callback for job with id '{0}'", job.Id); DoPostCallout(entityUri, LoadEntity(entityUri), parameters.Action, job.TenantId); } else if (parameters.Type == Model.CalloutDefinition.CalloutDefinitionType.Post.ToString()) { Debug.WriteLine("Process allow PRE action callback for job with id '{0}'", job.Id); DeleteStateChangeLockOfEntity(entityUri); } }
public void OnDeclineCallback(Job job) { var parameters = JsonConvert.DeserializeObject <CalloutData>(job.Parameters); var entityUri = new Uri(job.ReferencedItemId); if (parameters.Type == Model.CalloutDefinition.CalloutDefinitionType.Pre.ToString()) { Debug.WriteLine("Process deny POST action callback for job with id '{0}' - finish job and unlock entity", job.Id); } else if (parameters.Type == Model.CalloutDefinition.CalloutDefinitionType.Post.ToString()) { Debug.WriteLine("Process deny PRE action callback for job with id '{0}' - Reset state, finish job and unlock entity", job.Id); SetEntityState(entityUri, LoadEntity(entityUri), parameters.OriginalState); } ChangeJobState(job.Token, JobStateEnum.Canceled); DeleteStateChangeLockOfEntity(entityUri); }
public void OnAllowCallbackForPreCalloutRevertsTransactionAndThrowsInvalidOperationExceptionIfPostCalloutFails() { Job createdJob = null; Job updatedJob = null; Mock.Arrange(() => CurrentUserDataProvider.GetCurrentUsername()) .Returns("Administrator") .MustBeCalled(); Mock.Arrange(() => _coreService.Jobs) .IgnoreInstance() .ReturnsCollection(new List <Job>(new List <Job> { CreateJob(SAMPLE_ENTITY_URI.ToString()) })) .InSequence() .OccursOnce(); Mock.Arrange(() => _coreService.UpdateObject(Arg.IsAny <Job>())) .IgnoreInstance() .InSequence() .OccursOnce(); Mock.Arrange(() => _entityController.LoadEntity(SAMPLE_ENTITY_URI)) .IgnoreInstance() .Returns(SAMPLE_ENTITY) .MustBeCalled(); Mock.Arrange(() => HttpContext.Current.User.Identity) .Returns(_windowsIdentity) .MustBeCalled(); Mock.Arrange(() => CredentialCache.DefaultCredentials) .MustBeCalled(); Mock.Arrange(() => _windowsIdentity.Impersonate()) .MustBeCalled(); Mock.Arrange(() => _coreService.CalloutDefinitions) .IgnoreInstance() .ReturnsCollection(new List <CalloutDefinition>(new List <CalloutDefinition> { CreateCalloutDefinition(SAMPLE_ENTITY_URI.ToString(), Model.CalloutDefinition.CalloutDefinitionType.Post.ToString()) })) .MustBeCalled(); Mock.Arrange(() => _coreService.SaveChanges()) .IgnoreInstance() .Occurs(4); Mock.Arrange(() => _entityController.UpdateEntity(SAMPLE_ENTITY_URI, UPDATED_ENTITY)) .IgnoreInstance() .InSequence() .OccursOnce(); Mock.Arrange(() => _coreService.AddToJobs(Arg.IsAny <Job>())) .IgnoreInstance() .DoInstead((Job j) => { createdJob = j; }) .MustBeCalled(); Mock.Arrange(() => _calloutExecutor.ExecuteCallout(CALLOUT_DEFINITION, Arg.IsAny <CalloutData>())) .Throws <HttpRequestException>() .MustBeCalled(); Mock.Arrange(() => _coreService.Jobs) .IgnoreInstance() .ReturnsCollection(new List <Job>(new List <Job> { CreateJob(SAMPLE_ENTITY_URI.ToString(), false) })) .InSequence() .OccursOnce(); Mock.Arrange(() => _coreService.UpdateObject(Arg.IsAny <Job>())) .IgnoreInstance() .DoInstead((Job j) => { updatedJob = j; }) .InSequence() .OccursOnce(); Mock.Arrange(() => _entityController.UpdateEntity(SAMPLE_ENTITY_URI, SAMPLE_ENTITY)) .IgnoreInstance() .OccursOnce(); var stateChangeLockToBeDeleted = CreateStateChangeLock(SAMPLE_ENTITY_URI); Mock.Arrange(() => _coreService.StateChangeLocks) .IgnoreInstance() .ReturnsCollection(new List <StateChangeLock>(new List <StateChangeLock> { stateChangeLockToBeDeleted })) .InSequence() .MustBeCalled(); Mock.Arrange(() => _coreService.DeleteObject(stateChangeLockToBeDeleted)) .IgnoreInstance() .OccursOnce(); var lifeCycleManager = new LifeCycleManager(_authenticationProvider, ENTITY_TYPE); lifeCycleManager._calloutExecutor = _calloutExecutor; ThrowsAssert.Throws <InvalidOperationException>(() => lifeCycleManager.OnAllowCallback(CreateJob(SAMPLE_ENTITY_URI.ToString()))); Assert.AreEqual(JobStateEnum.Failed.ToString(), updatedJob.State); Assert.AreEqual(EXPECTED_POST_CALLOUT_DATA, createdJob.Parameters); Assert.AreEqual(SAMPLE_ENTITY_URI.ToString(), createdJob.ReferencedItemId); Assert.AreEqual(JobStateEnum.Running.ToString(), createdJob.State); Assert.AreEqual(CALLOUT_JOB_TYPE, createdJob.Type); Assert.AreEqual(TENANT_ID, createdJob.TenantId); Mock.Assert(_coreService); Mock.Assert(_calloutExecutor); Mock.Assert(_entityController); Mock.Assert(() => CurrentUserDataProvider.GetCurrentUsername()); Mock.Assert(() => HttpContext.Current.User.Identity); Mock.Assert(CredentialCache.DefaultCredentials); Mock.Assert(_windowsIdentity); }
public void RequestStateChangeForNonLockedEntityWithoutPreCalloutDefinitionChangesStateAndExecutesPostCallout() { Job createdJob = null; Mock.Arrange(() => CurrentUserDataProvider.GetCurrentUsername()) .Returns("Administrator") .MustBeCalled(); Mock.Arrange(() => _coreService.StateChangeLocks) .IgnoreInstance() .ReturnsCollection(new List <StateChangeLock>(new List <StateChangeLock> { CreateStateChangeLock(SAMPLE_ENTITY_URI_2) })) .MustBeCalled(); Mock.Arrange(() => HttpContext.Current.User.Identity) .Returns(_windowsIdentity) .MustBeCalled(); Mock.Arrange(() => CredentialCache.DefaultCredentials) .MustBeCalled(); Mock.Arrange(() => _windowsIdentity.Impersonate()) .MustBeCalled(); Mock.Arrange(() => _coreService.CalloutDefinitions) .IgnoreInstance() .ReturnsCollection(new List <CalloutDefinition>(new List <CalloutDefinition> { CreateCalloutDefinition(SAMPLE_ENTITY_URI.ToString(), Model.CalloutDefinition.CalloutDefinitionType.Post.ToString()) })) .MustBeCalled(); Mock.Arrange(() => _coreService.AddToStateChangeLocks(Arg.IsAny <StateChangeLock>())) .IgnoreInstance() .MustBeCalled(); Mock.Arrange(() => _coreService.SaveChanges()) .IgnoreInstance() .MustBeCalled(); Mock.Arrange(() => _entityController.UpdateEntity(SAMPLE_ENTITY_URI, UPDATED_ENTITY)) .IgnoreInstance() .MustBeCalled(); Mock.Arrange(() => _coreService.AddToJobs(Arg.IsAny <Job>())) .IgnoreInstance() .DoInstead((Job j) => { createdJob = j; }) .MustBeCalled(); Mock.Arrange(() => _coreService.Jobs) .IgnoreInstance() .ReturnsCollection(new List <Job>(new List <Job> { CreateJob(SAMPLE_ENTITY_URI.ToString()) })) .MustBeCalled(); Mock.Arrange(() => _calloutExecutor.ExecuteCallout(CALLOUT_DEFINITION, Arg.IsAny <CalloutData>())) .MustBeCalled(); var lifeCycleManager = new LifeCycleManager(_authenticationProvider, ENTITY_TYPE); lifeCycleManager._calloutExecutor = _calloutExecutor; lifeCycleManager.RequestStateChange(SAMPLE_ENTITY_URI, SAMPLE_ENTITY, CONTINUE_CONDITION, TENANT_ID); Assert.AreEqual(EXPECTED_POST_CALLOUT_DATA, createdJob.Parameters); Assert.AreEqual(SAMPLE_ENTITY_URI.ToString(), createdJob.ReferencedItemId); Assert.AreEqual(JobStateEnum.Running.ToString(), createdJob.State); Assert.AreEqual(CALLOUT_JOB_TYPE, createdJob.Type); Assert.AreEqual(TENANT_ID, createdJob.TenantId); Mock.Assert(_coreService); Mock.Assert(_calloutExecutor); Mock.Assert(_entityController); Mock.Assert(() => CurrentUserDataProvider.GetCurrentUsername()); }
public void RequestStateChangeForNonLockedEntityRevertsTransactionAndThrowsInvalidOperationExceptionIfPreCalloutFails() { Job updatedJob = null; Mock.Arrange(() => CurrentUserDataProvider.GetCurrentUsername()) .Returns("Administrator") .MustBeCalled(); Mock.Arrange(() => _coreService.StateChangeLocks) .IgnoreInstance() .ReturnsCollection(new List <StateChangeLock>(new List <StateChangeLock> { CreateStateChangeLock(SAMPLE_ENTITY_URI_2) })) .InSequence() .MustBeCalled(); Mock.Arrange(() => HttpContext.Current.User.Identity) .Returns(_windowsIdentity) .MustBeCalled(); Mock.Arrange(() => CredentialCache.DefaultCredentials) .MustBeCalled(); Mock.Arrange(() => _windowsIdentity.Impersonate()) .MustBeCalled(); Mock.Arrange(() => _coreService.CalloutDefinitions) .IgnoreInstance() .ReturnsCollection(new List <CalloutDefinition>(new List <CalloutDefinition> { CreateCalloutDefinition(SAMPLE_ENTITY_URI.ToString(), Model.CalloutDefinition.CalloutDefinitionType.Pre.ToString()) })) .MustBeCalled(); Mock.Arrange(() => _coreService.AddToStateChangeLocks(Arg.IsAny <StateChangeLock>())) .IgnoreInstance() .MustBeCalled(); Mock.Arrange(() => _coreService.SaveChanges()) .IgnoreInstance() .Occurs(4); Mock.Arrange(() => _coreService.AddToJobs(Arg.IsAny <Job>())) .IgnoreInstance() .MustBeCalled(); Mock.Arrange(() => _calloutExecutor.ExecuteCallout(CALLOUT_DEFINITION, Arg.IsAny <CalloutData>())) .Throws <HttpRequestException>() .MustBeCalled(); Mock.Arrange(() => _coreService.Jobs) .IgnoreInstance() .ReturnsCollection(new List <Job>(new List <Job> { CreateJob(SAMPLE_ENTITY_URI.ToString()) })) .MustBeCalled(); Mock.Arrange(() => _coreService.UpdateObject(Arg.IsAny <Job>())) .IgnoreInstance() .DoInstead((Job j) => { updatedJob = j; }) .MustBeCalled(); var stateChangeLockToBeDeleted = CreateStateChangeLock(SAMPLE_ENTITY_URI); Mock.Arrange(() => _coreService.StateChangeLocks) .IgnoreInstance() .ReturnsCollection(new List <StateChangeLock>(new List <StateChangeLock> { stateChangeLockToBeDeleted })) .InSequence() .MustBeCalled(); Mock.Arrange(() => _coreService.DeleteObject(stateChangeLockToBeDeleted)) .IgnoreInstance() .OccursOnce(); var lifeCycleManager = new LifeCycleManager(_authenticationProvider, ENTITY_TYPE); lifeCycleManager._calloutExecutor = _calloutExecutor; ThrowsAssert.Throws <InvalidOperationException>(() => lifeCycleManager. RequestStateChange(SAMPLE_ENTITY_URI, SAMPLE_ENTITY, CONTINUE_CONDITION, TENANT_ID)); Assert.AreEqual(JobStateEnum.Failed.ToString(), updatedJob.State); Mock.Assert(_coreService); Mock.Assert(_calloutExecutor); Mock.Assert(() => CurrentUserDataProvider.GetCurrentUsername()); Mock.Assert(() => HttpContext.Current.User.Identity); Mock.Assert(CredentialCache.DefaultCredentials); Mock.Assert(_windowsIdentity); }
public void OnDeclineCallback(Job job) { var parameters = JsonConvert.DeserializeObject<CalloutData>(job.Parameters); var entityUri = new Uri(job.ReferencedItemId); if (parameters.Type == Model.CalloutDefinition.CalloutDefinitionType.Pre.ToString()) { Debug.WriteLine("Process deny POST action callback for job with id '{0}' - finish job and unlock entity", job.Id); } else if (parameters.Type == Model.CalloutDefinition.CalloutDefinitionType.Post.ToString()) { Debug.WriteLine("Process deny PRE action callback for job with id '{0}' - Reset state, finish job and unlock entity", job.Id); SetEntityState(entityUri, LoadEntity(entityUri), parameters.OriginalState); } ChangeJobState(job.Token, JobStateEnum.Canceled); DeleteStateChangeLockOfEntity(entityUri); }
public void OnAllowCallback(Job job) { var parameters = JsonConvert.DeserializeObject<CalloutData>(job.Parameters); var entityUri = new Uri(job.ReferencedItemId); ChangeJobState(job.Token, JobStateEnum.Finished); if (parameters.Type == Model.CalloutDefinition.CalloutDefinitionType.Pre.ToString()) { Debug.WriteLine("Process allow POST action callback for job with id '{0}'", job.Id); DoPostCallout(entityUri, LoadEntity(entityUri), parameters.Action, job.TenantId); } else if (parameters.Type == Model.CalloutDefinition.CalloutDefinitionType.Post.ToString()) { Debug.WriteLine("Process allow PRE action callback for job with id '{0}'", job.Id); DeleteStateChangeLockOfEntity(entityUri); } }