private static IEnumerable <TeachingEvent> MockEvents()
        {
            var event1 = new TeachingEvent()
            {
                Name = "Event 1", TypeId = 123
            };
            var event2 = new TeachingEvent()
            {
                Name = "Event 2", TypeId = 123
            };
            var event3 = new TeachingEvent()
            {
                Name = "Event 3", TypeId = 123
            };
            var event4 = new TeachingEvent()
            {
                Name = "Event 4", TypeId = 123
            };
            var event5 = new TeachingEvent()
            {
                Name = "Event 5", TypeId = 456
            };

            return(new[] { event1, event2, event3, event4, event5 });
        }
示例#2
0
        public void CandidateYetToRegisterForTeachingEvent_WhenNotYetRegistered_ReturnsTrue()
        {
            var candidate = new Candidate()
            {
                Id = Guid.NewGuid()
            };
            var teachingEvent = new TeachingEvent()
            {
                Id = Guid.NewGuid()
            };

            var entity = new Entity();

            entity["msevtmgt_contactid"] = new EntityReference("dfe_candidate", (Guid)candidate.Id);
            entity["msevtmgt_eventid"]   = new EntityReference("msevtmgt_event", (Guid)teachingEvent.Id);

            _mockService.Setup(m => m.CreateQuery("dfe_candidateprivacypolicy", _context))
            .Returns(new List <Entity> {
                entity
            }.AsQueryable());

            var result = _crm.CandidateYetToRegisterForTeachingEvent((Guid)candidate.Id, Guid.NewGuid());

            result.Should().BeTrue();
        }
示例#3
0
        public void Validate_EventDoesNotAcceptOnlineRegistrations_HasError()
        {
            var mockTeachingEvent = new TeachingEvent {
                Id = Guid.NewGuid(), WebFeedId = null
            };
            var mockPickListItem = new PickListItem {
                Id = 123
            };

            _mockStore
            .Setup(mock => mock.GetTeachingEventAsync((Guid)mockTeachingEvent.Id))
            .ReturnsAsync(mockTeachingEvent);
            _mockStore
            .Setup(mock => mock.GetPickListItems("msevtmgt_eventregistration", "dfe_channelcreation"))
            .Returns(new[] { mockPickListItem }.AsQueryable());

            var registration = new TeachingEventRegistration()
            {
                EventId   = (Guid)mockTeachingEvent.Id,
                ChannelId = mockPickListItem.Id,
            };

            var result = _validator.TestValidate(registration);

            result.IsValid.Should().BeFalse();

            result.ShouldHaveValidationErrorFor("EventId")
            .WithErrorMessage("Attendence cannot be registered for this event via the API (it has no WebFeedId).");
        }
示例#4
0
        public void Validate_WhenValid_HasNoErrors()
        {
            var mockTeachingEvent = new TeachingEvent {
                Id = Guid.NewGuid(), WebFeedId = "123"
            };
            var mockPickListItem = new PickListItem {
                Id = 123
            };

            _mockStore
            .Setup(mock => mock.GetTeachingEventAsync((Guid)mockTeachingEvent.Id))
            .ReturnsAsync(mockTeachingEvent);
            _mockStore
            .Setup(mock => mock.GetPickListItems("msevtmgt_eventregistration", "dfe_channelcreation"))
            .Returns(new[] { mockPickListItem }.AsQueryable());

            var registration = new TeachingEventRegistration()
            {
                EventId   = (Guid)mockTeachingEvent.Id,
                ChannelId = mockPickListItem.Id,
            };

            var result = _validator.TestValidate(registration);

            result.IsValid.Should().BeTrue();
        }
示例#5
0
        public async Task <IActionResult> Upsert([FromBody] TeachingEvent teachingEvent)
        {
            var operation = new TeachingEventUpsertOperation(teachingEvent);
            var validator = new TeachingEventUpsertOperationValidator(_crm);
            var result    = validator.Validate(operation);

            result.AddToModelState(ModelState, null);

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            // Save independently so that the building gets an Id populated immediately.
            // We also persist in the cache so it is immediately available.
            if (teachingEvent.Building != null)
            {
                _crm.Save(teachingEvent.Building);
                await _store.SaveAsync(new TeachingEventBuilding[] { teachingEvent.Building });

                teachingEvent.BuildingId = teachingEvent.Building.Id;
            }

            _crm.Save(teachingEvent);
            await _store.SaveAsync(new TeachingEvent[] { teachingEvent });

            return(CreatedAtAction(
                       actionName: nameof(Get),
                       routeValues: new { readableId = teachingEvent.ReadableId },
                       value: teachingEvent));
        }
        public async Task Upsert_ValidRequestWithBuilding_SavesInCrmAndCaches()
        {
            const string testName    = "test";
            var          buildingId  = Guid.NewGuid();
            var          newBuilding = new TeachingEventBuilding()
            {
                Id = buildingId
            };
            var newTeachingEvent = new TeachingEvent()
            {
                Name = testName, Building = newBuilding
            };

            _mockCrm.Setup(mock => mock.Save(newBuilding)).Verifiable();
            _mockCrm.Setup(mock => mock.Save(It.Is <TeachingEvent>(e => e.BuildingId == buildingId))).Verifiable();
            _mockStore.Setup(mock => mock.SaveAsync(new TeachingEventBuilding[] { newBuilding })).Verifiable();
            _mockStore.Setup(mock => mock.SaveAsync(new TeachingEvent[] { newTeachingEvent })).Verifiable();

            var response = await _controller.Upsert(newTeachingEvent);

            _mockCrm.Verify();
            _mockStore.Verify();
            var created       = response.Should().BeOfType <CreatedAtActionResult>().Subject;
            var teachingEvent = created.Value.Should().BeAssignableTo <TeachingEvent>().Subject;

            teachingEvent.Name.Should().Be(testName);
            teachingEvent.Building.Should().Be(newBuilding);
        }
        public void InternalName_Set_ReturnsName()
        {
            var teachingEvent = new TeachingEvent()
            {
                Name = "name"
            };

            teachingEvent.InternalName.Should().Be(teachingEvent.Name);
        }
示例#8
0
        public void Validate_EndAtIsEarlierThanStartAt_HasError()
        {
            var invalidTeachingEvent = new TeachingEvent
            {
                StartAt = DateTime.UtcNow.AddDays(2),
                EndAt   = DateTime.UtcNow.AddDays(1)
            };

            _validator.ShouldHaveValidationErrorFor(teachingEvent => teachingEvent.EndAt, invalidTeachingEvent);
        }
        public void Constructor_WithTeachingEvent()
        {
            var teachingEvent = new TeachingEvent()
            {
                Id = Guid.NewGuid(), ReadableId = "test-1"
            };

            var operation = new TeachingEventUpsertOperation(teachingEvent);

            operation.Id.Should().Be(teachingEvent.Id);
            operation.ReadableId.Should().Be(teachingEvent.ReadableId);
        }
        public async Task SaveAsync_WithNewModel_Adds()
        {
            var teachingEvent = new TeachingEvent()
            {
                Id = Guid.NewGuid(), Name = "TestEvent"
            };

            await _store.SaveAsync(new TeachingEvent[] { teachingEvent });

            DbContext.TeachingEvents
            .FirstOrDefault(e => e.Name == teachingEvent.Name)
            .Should().NotBeNull();
        }
        public void IsVirtual_ReturnsCorrectly(bool isOnline, string addressPostcode, bool expected)
        {
            var teachingEvent = new TeachingEvent()
            {
                IsOnline = isOnline,
                Building = new TeachingEventBuilding()
                {
                    AddressPostcode = addressPostcode
                },
            };

            teachingEvent.IsVirtual.Should().Be(expected);
        }
        public async Task Upsert_WhenRequestIsInvalid_RepondsWithValidationErrorAsync()
        {
            const string expectedErrorKey     = "Name";
            const string expectedErrorMessage = "Name must be specified";
            var          request = new TeachingEvent();

            _controller.ModelState.AddModelError(expectedErrorKey, expectedErrorMessage);

            var response = await _controller.Upsert(request);

            var badRequest = response.Should().BeOfType <BadRequestObjectResult>().Subject;
            var errors     = badRequest.Value.Should().BeOfType <SerializableError>().Subject;

            errors.Should().ContainKey(expectedErrorKey).WhichValue.Should().BeOfType <string[]>().Which.Should().Contain(expectedErrorMessage);
        }
        public async void Get_ReturnsTeachingEvent()
        {
            var teachingEvent = new TeachingEvent()
            {
                ReadableId = "123"
            };

            _mockStore.Setup(mock => mock.GetTeachingEventAsync(teachingEvent.ReadableId)).ReturnsAsync(teachingEvent);

            var response = await _controller.Get(teachingEvent.ReadableId);

            var ok = response.Should().BeOfType <OkObjectResult>().Subject;

            ok.Value.Should().Be(teachingEvent);
        }
        public void IsInPerson_ReturnsCorrectly(bool isOnline, bool isVirtual, bool expected)
        {
            var teachingEvent = new TeachingEvent()
            {
                IsOnline = isOnline,
            };

            if (isVirtual || !isOnline)
            {
                teachingEvent.Building = new TeachingEventBuilding()
                {
                    AddressPostcode = "KY11 9YU"
                };
            }

            teachingEvent.IsInPerson.Should().Be(expected);
        }
示例#15
0
        public void Validate_WhenValid_HasNoErrors()
        {
            var client = new TeachingEvent()
            {
                ReadableId           = "Test",
                Name                 = "Test name",
                Summary              = "Test summary",
                Description          = "Test description",
                ProviderContactEmail = "*****@*****.**",
                StartAt              = DateTime.UtcNow.AddDays(1),
                EndAt                = DateTime.UtcNow.AddDays(1),
            };

            var result = _validator.Validate(client);

            result.IsValid.Should().BeTrue();
        }
        public void Validate_WhenExistingEventWithReadableIdHasDifferentTeachingEventId_HasErrors()
        {
            var operation = new TeachingEventUpsertOperation()
            {
                Id = Guid.NewGuid(), ReadableId = "existing"
            };
            var teachingEvent = new TeachingEvent()
            {
                Id = Guid.NewGuid()
            };

            _mockCrm.Setup(m => m.GetTeachingEvent("existing")).Returns(teachingEvent);

            var result = _validator.Validate(operation);

            result.IsValid.Should().BeFalse();
        }
        public async Task SaveAsync_WithExistingModel_Updates()
        {
            var teachingEvent = new TeachingEvent()
            {
                Id = Guid.NewGuid(), Name = "TestEvent"
            };

            await _store.SaveAsync(new TeachingEvent[] { teachingEvent });

            teachingEvent.Name += "Updated";

            await _store.SaveAsync(new TeachingEvent[] { teachingEvent });

            var teachingEventNames = DbContext.TeachingEvents.Select(e => e.Name).ToList();

            teachingEventNames.ForEach(name => name.Should().Contain("Updated"));
        }
        public void AddAttendee_ValidRequest_EnqueuesJobRespondsWithNoContent()
        {
            var teachingEvent = new TeachingEvent()
            {
                Id = Guid.NewGuid()
            };
            var request = new TeachingEventAddAttendee()
            {
                EventId = (Guid)teachingEvent.Id, Email = "*****@*****.**", FirstName = "John", LastName = "Doe"
            };

            var response = _controller.AddAttendee(request);

            response.Should().BeOfType <NoContentResult>();
            _mockJobClient.Verify(x => x.Create(
                                      It.Is <Job>(job => job.Type == typeof(UpsertCandidateJob) && job.Method.Name == "Run" &&
                                                  IsMatch(request.Candidate, (string)job.Args[0])),
                                      It.IsAny <EnqueuedState>()));
        }
        public async Task Upsert_WhenReadableIdIsNotUnique_RepondsWithValidationErrorAsync()
        {
            var existingTeachingEvent = new TeachingEvent()
            {
                Id = Guid.NewGuid(), ReadableId = "existing"
            };

            _mockCrm.Setup(m => m.GetTeachingEvent("existing")).Returns(existingTeachingEvent);

            var request = new TeachingEvent()
            {
                ReadableId = "existing"
            };

            var response = await _controller.Upsert(request);

            var badRequest = response.Should().BeOfType <BadRequestObjectResult>().Subject;
            var errors     = badRequest.Value.Should().BeOfType <SerializableError>().Subject;

            errors.Should().ContainKey("ReadableId").WhichValue.Should().BeOfType <string[]>().Which.Should().Contain("Must be unique");
        }
        private static List <TeachingEvent> MockTeachingEvents()
        {
            var buildings        = MockTeachingEventBuildings();
            var sharedBuildingId = buildings[0].Id;

            var event1 = new TeachingEvent()
            {
                Id         = Guid.NewGuid(),
                ReadableId = "1",
                Name       = "Event 1",
                TypeId     = (int)TeachingEvent.EventType.TrainToTeachEvent,
                IsOnline   = true,
                StartAt    = DateTime.UtcNow.AddDays(5),
                BuildingId = sharedBuildingId
            };

            var event2 = new TeachingEvent()
            {
                Id         = FindEventGuid,
                ReadableId = "2",
                Name       = "Event 2",
                StartAt    = DateTime.UtcNow.AddDays(1),
                TypeId     = (int)TeachingEvent.EventType.ApplicationWorkshop,
                BuildingId = buildings[1].Id
            };

            var event3 = new TeachingEvent()
            {
                Id         = Guid.NewGuid(),
                ReadableId = "3",
                Name       = "Event 3",
                StartAt    = DateTime.UtcNow.AddDays(10),
                TypeId     = (int)TeachingEvent.EventType.SchoolOrUniversityEvent,
                BuildingId = buildings[2].Id
            };

            var event4 = new TeachingEvent()
            {
                Id         = Guid.NewGuid(),
                ReadableId = "4",
                Name       = "Event 4",
                StartAt    = DateTime.UtcNow.AddDays(3),
                TypeId     = (int)TeachingEvent.EventType.SchoolOrUniversityEvent,
                BuildingId = buildings[3].Id
            };

            var event5 = new TeachingEvent()
            {
                Id         = Guid.NewGuid(),
                ReadableId = "5",
                Name       = "Event 5",
                IsOnline   = true,
                TypeId     = (int)TeachingEvent.EventType.OnlineEvent,
                StartAt    = DateTime.UtcNow.AddDays(15),
            };

            var event6 = new TeachingEvent()
            {
                Id         = Guid.NewGuid(),
                ReadableId = "6",
                Name       = "Event 6",
                StartAt    = DateTime.UtcNow.AddDays(60),
                TypeId     = (int)TeachingEvent.EventType.SchoolOrUniversityEvent,
                BuildingId = sharedBuildingId
            };

            var event7 = new TeachingEvent()
            {
                Id         = Guid.NewGuid(),
                ReadableId = "7",
                Name       = "Event 7",
                StartAt    = DateTime.UtcNow.AddYears(-1),
                TypeId     = (int)TeachingEvent.EventType.SchoolOrUniversityEvent,
                BuildingId = buildings[4].Id
            };

            return(new List <TeachingEvent>()
            {
                event1, event2, event3, event4, event5, event6, event7
            });
        }
        public void InternalTimeZone_Default_ReturnsGmtCode()
        {
            var teachingEvent = new TeachingEvent();

            teachingEvent.InternalTimeZone.Should().Be(85);
        }