public void GetJobData_ReturnsResult_WhenJobExists()
        {
            var job = Job.FromExpression(() => HangfireTestJobs.SampleMethod("wrong"));

            var jobDto = new JobDto
            {
                Id             = Guid.NewGuid().ToString(),
                InvocationData = SerializationHelper.Serialize(InvocationData.SerializeJob(job)),
                Arguments      = "[\"\\\"Arguments\\\"\"]",
                StateName      = SucceededState.StateName,
                Created        = DateTime.UtcNow
            };
            var realm = _storage.GetRealm();

            realm.Write(() => { realm.Add(jobDto); });

            var result = _connection.GetJobData(jobDto.Id.ToString());

            Assert.NotNull(result);
            Assert.NotNull(result.Job);
            Assert.AreEqual(SucceededState.StateName, result.State);
            Assert.AreEqual("Arguments", result.Job.Args[0]);
            Assert.Null(result.LoadException);
            Assert.True(DateTime.UtcNow.AddMinutes(-1) < result.CreatedAt);
            Assert.True(result.CreatedAt < DateTime.UtcNow.AddMinutes(1));
        }
        public void GetJobData_ReturnsResult_WhenJobExists()
        {
            var job = Job.FromExpression(() => HangfireTestJobs.SampleMethod("wrong"));

            var jobDto = new JobDto
            {
                Id             = ObjectId.GenerateNewId(),
                InvocationData = JobHelper.ToJson(InvocationData.Serialize(job)),
                Arguments      = "[\"\\\"Arguments\\\"\"]",
                StateName      = SucceededState.StateName,
                CreatedAt      = DateTime.UtcNow
            };

            _dbContext.JobGraph.InsertOne(jobDto);

            var result = _connection.GetJobData(jobDto.Id.ToString());

            Assert.NotNull(result);
            Assert.NotNull(result.Job);
            Assert.Equal(SucceededState.StateName, result.State);
            Assert.Equal("Arguments", result.Job.Args[0]);
            Assert.Null(result.LoadException);
            Assert.True(DateTime.UtcNow.AddMinutes(-1) < result.CreatedAt);
            Assert.True(result.CreatedAt < DateTime.UtcNow.AddMinutes(1));
        }
        public void CreateExpiredJob_ThrowsAnException_WhenParametersCollectionIsNull()
        {
            var exception = Assert.Throws <ArgumentNullException>(
                () => _connection.CreateExpiredJob(
                    Job.FromExpression(() => HangfireTestJobs.SampleMethod("hello")),
                    null,
                    DateTime.UtcNow,
                    TimeSpan.Zero));

            Assert.Equal("parameters", exception.ParamName);
        }
        public void CreateExpiredJob_CreatesAJobInTheStorage_AndSetsItsParameters()
        {
            var createdAt = new DateTime(2012, 12, 12, 0, 0, 0, 0, DateTimeKind.Utc);
            var jobId     = _connection.CreateExpiredJob(
                Job.FromExpression(() => HangfireTestJobs.SampleMethod("Hello")),
                new Dictionary <string, string> {
                { "Key1", "Value1" }, { "Key2", "Value2" }
            },
                createdAt,
                TimeSpan.FromDays(1));

            Assert.NotNull(jobId);
            Assert.NotEmpty(jobId);

            var databaseJob = _dbContext.JobGraph.OfType <JobDto>().Find(new BsonDocument()).ToList().Single();

            Assert.Equal(jobId, databaseJob.Id.ToString());
            Assert.Equal(createdAt, databaseJob.CreatedAt);
            Assert.Null(databaseJob.StateName);

            var invocationData = JobHelper.FromJson <InvocationData>(databaseJob.InvocationData);

            invocationData.Arguments = databaseJob.Arguments;

            var job = invocationData.Deserialize();

            Assert.Equal(typeof(HangfireTestJobs), job.Type);
            Assert.Equal(nameof(HangfireTestJobs.SampleMethod), job.Method.Name);
            Assert.Equal("Hello", job.Args[0]);

            Assert.True(createdAt.AddDays(1).AddMinutes(-1) < databaseJob.ExpireAt);
            Assert.True(databaseJob.ExpireAt < createdAt.AddDays(1).AddMinutes(1));

            var parameters = _dbContext
                             .JobGraph.OfType <JobDto>()
                             .Find(Builders <JobDto> .Filter.Eq(_ => _.Id, ObjectId.Parse(jobId)))
                             .Project(j => j.Parameters)
                             .ToList()
                             .SelectMany(j => j)
                             .ToDictionary(p => p.Key, x => x.Value);

            Assert.NotNull(parameters);
            Assert.Equal("Value1", parameters["Key1"]);
            Assert.Equal("Value2", parameters["Key2"]);
        }
        public void CreateExpiredJob_CreatesAJobInTheStorage_AndSetsItsParameters()
        {
            var createdAt = new DateTime(2012, 12, 12, 0, 0, 0, 0, DateTimeKind.Utc);
            var jobId     = _connection.CreateExpiredJob(
                Job.FromExpression(() => HangfireTestJobs.SampleMethod("Hello")),
                new Dictionary <string, string> {
                { "Key1", "Value1" }, { "Key2", "Value2" }
            },
                createdAt,
                TimeSpan.FromDays(1));
            var realm = _storage.GetRealm();

            Assert.NotNull(jobId);
            Assert.IsNotEmpty(jobId);

            var databaseJob = realm.Find <JobDto>(jobId);

            Assert.AreEqual(jobId, databaseJob.Id.ToString());
            Assert.AreEqual(createdAt, databaseJob.Created.DateTime);
            Assert.Null(databaseJob.StateName);

            var invocationData = SerializationHelper.Deserialize <InvocationData>(databaseJob.InvocationData);

            invocationData.Arguments = databaseJob.Arguments;

            var job = invocationData.DeserializeJob();

            Assert.AreEqual(typeof(HangfireTestJobs), job.Type);
            Assert.AreEqual(nameof(HangfireTestJobs.SampleMethod), job.Method.Name);
            Assert.AreEqual("Hello", job.Args[0]);

            Assert.True(createdAt.AddDays(1).AddMinutes(-1) < databaseJob.ExpireAt);
            Assert.True(databaseJob.ExpireAt < createdAt.AddDays(1).AddMinutes(1));

            var parameters = realm.Find <JobDto>(jobId).Parameters;
            Dictionary <string, string> paramDictionary = parameters.ToDictionary(_ => _.Key, _ => _.Value);

            Assert.NotNull(parameters);
            Assert.AreEqual("Value1", paramDictionary["Key1"]);
            Assert.AreEqual("Value2", paramDictionary["Key2"]);
        }
        private JobDto CreateJobInState(HangfireDbContext database, ObjectId jobId, string stateName, Func <JobDto, JobDto> visitor = null)
        {
            var job = Job.FromExpression(() => HangfireTestJobs.SampleMethod("wrong"));

            Dictionary <string, string> stateData;

            if (stateName == EnqueuedState.StateName)
            {
                stateData = new Dictionary <string, string> {
                    ["EnqueuedAt"] = $"{DateTime.UtcNow:o}"
                };
            }
            else if (stateName == ProcessingState.StateName)
            {
                stateData = new Dictionary <string, string>
                {
                    ["ServerId"]  = Guid.NewGuid().ToString(),
                    ["StartedAt"] = JobHelper.SerializeDateTime(DateTime.UtcNow.Subtract(TimeSpan.FromMilliseconds(500)))
                };
            }
            else if (stateName == FailedState.StateName)
            {
                stateData = new Dictionary <string, string>
                {
                    ["ExceptionDetails"] = "Test_ExceptionDetails",
                    ["ExceptionMessage"] = "Test_ExceptionMessage",
                    ["ExceptionType"]    = "Test_ExceptionType",
                    ["FailedAt"]         = JobHelper.SerializeDateTime(DateTime.UtcNow.Subtract(TimeSpan.FromMilliseconds(10)))
                };
            }
            else
            {
                stateData = new Dictionary <string, string>();
            }

            var jobState = new StateDto()
            {
                Name      = stateName,
                Reason    = null,
                CreatedAt = DateTime.UtcNow,
                Data      = stateData
            };

            var jobDto = new JobDto
            {
                Id             = jobId,
                InvocationData = JobHelper.ToJson(InvocationData.Serialize(job)),
                Arguments      = "[\"\\\"Arguments\\\"\"]",
                StateName      = stateName,
                CreatedAt      = DateTime.UtcNow,
                StateHistory   = new[] { jobState }
            };

            if (visitor != null)
            {
                jobDto = visitor(jobDto);
            }
            database.Job.InsertOne(jobDto);

            var jobQueueDto = new JobQueueDto
            {
                FetchedAt = null,
                JobId     = jobId,
                Queue     = DefaultQueue
            };

            if (stateName == FetchedStateName)
            {
                jobQueueDto.FetchedAt = DateTime.UtcNow;
            }

            database.JobQueue.InsertOne(jobQueueDto);

            return(jobDto);
        }
        private JobDto CreateJobInState(string stateName, DateTime created = default(DateTime), Action <JobDto> visitor = null)
        {
            var job = Common.Job.FromExpression(() => HangfireTestJobs.SampleMethod("wrong"));

            if (created == default(DateTime))
            {
                created = DateTime.Now;
            }

            Dictionary <string, string> stateData;

            if (stateName == EnqueuedState.StateName)
            {
                stateData = new Dictionary <string, string> {
                    ["EnqueuedAt"] = $"{DateTime.UtcNow:o}"
                };
            }
            else if (stateName == ProcessingState.StateName)
            {
                stateData = new Dictionary <string, string>
                {
                    ["ServerId"]  = Guid.NewGuid().ToString(),
                    ["StartedAt"] = JobHelper.SerializeDateTime(DateTime.UtcNow.Subtract(TimeSpan.FromMilliseconds(500)))
                };
            }
            else if (stateName == FailedState.StateName)
            {
                stateData = new Dictionary <string, string>
                {
                    ["ExceptionDetails"] = "Test_ExceptionDetails",
                    ["ExceptionMessage"] = "Test_ExceptionMessage",
                    ["ExceptionType"]    = "Test_ExceptionType",
                    ["FailedAt"]         = JobHelper.SerializeDateTime(DateTime.UtcNow.Subtract(TimeSpan.FromMilliseconds(10)))
                };
            }
            else
            {
                stateData = new Dictionary <string, string>();
            }

            var jobState = new StateDto()
            {
                Name   = stateName,
                Reason = null
            };

            foreach (var item in stateData)
            {
                jobState.Data.Add(new StateDataDto(item));
            }

            var jobDto = new JobDto
            {
                Id             = Guid.NewGuid().ToString(),
                Created        = created,
                InvocationData = SerializationHelper.Serialize(InvocationData.SerializeJob(job)),
                Arguments      = "[\"\\\"Arguments\\\"\"]",
                StateName      = stateName
            };

            jobDto.StateHistory.Add(jobState);

            visitor?.Invoke(jobDto);

            _realm.Write(() => _realm.Add(jobDto));

            var jobQueueDto = new JobQueueDto
            {
                Id        = Guid.NewGuid().ToString(),
                FetchedAt = null,
                JobId     = jobDto.Id,
                Queue     = DefaultQueue
            };

            if (stateName == FetchedStateName)
            {
                jobQueueDto.FetchedAt = DateTime.UtcNow;
            }
            _realm.Write(() => _realm.Add(jobQueueDto));

            return(jobDto);
        }