public async Task ShouldReturn200IfResidentIsAlreadyPresentInDatabase()
        {
            var residentInDb = E2ETestsHelper.AddResidentRecordToTheDatabase(ResidentContactContext);
            var crmReference = E2ETestsHelper.AddCrmContactIdForResidentId(ResidentContactContext, residentInDb.Id);

            var request = new InsertResidentRequest
            {
                FirstName          = _faker.Random.Word(),
                LastName           = _faker.Random.Word(),
                DateOfBirth        = _faker.Date.Past(),
                ExternalReferences = new List <InsertExternalReferenceRequest> {
                    new InsertExternalReferenceRequest {
                        ExternalReferenceValue = crmReference.ExternalIdValue,
                        ExternalReferenceName  = "ContactId",
                        ExternalSystemId       = crmReference.ExternalSystemLookupId
                    }
                }
            };

            var url = new Uri("/api/v1/residents", UriKind.Relative);

            using var requestContent =
                      new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
            var response = await Client.PostAsync(url, requestContent).ConfigureAwait(true);

            var content = response.Content.ReadAsStringAsync().Result;
            var insertResidentResponse = JsonConvert.DeserializeObject <InsertResidentResponse>(content);

            response.StatusCode.Should().Be(200);
            insertResidentResponse.ResidentRecordAlreadyPresent.Should().BeTrue();
        }
        public async Task WithCursorAndLimitGivenWillCorrectlyPaginateResidentsReturned()
        {
            var allSavedEntities = Enumerable.Range(0, 17)
                                   .Select(r =>
                                           E2ETestsHelper
                                           .AddPersonWithRelatedEntitiesToDb(ResidentContactContext, r + 1))
                                   .ToList();

            var response = await CallEndpointWithQueryString("?limit=12&cursor=3").ConfigureAwait(true);

            response.StatusCode.Should().Be(200);

            var returnedTenancies = await DeserializeResponse(response).ConfigureAwait(true);

            returnedTenancies.Residents.Should().BeEquivalentTo(allSavedEntities.Skip(3).Take(12));
        }
        public async Task FirstNameLastNameQueryParametersWildcardSearchReturnsMatchingResidentRecords()
        {
            var expectedResidentResponseOne   = E2ETestsHelper.AddPersonWithRelatedEntitiesToDb(ResidentContactContext, firstname: "ciasom", lastname: "tessellate");
            var expectedResidentResponseTwo   = E2ETestsHelper.AddPersonWithRelatedEntitiesToDb(ResidentContactContext, firstname: "ciasom", lastname: "shape");
            var expectedResidentResponseThree = E2ETestsHelper.AddPersonWithRelatedEntitiesToDb(ResidentContactContext);

            var response   = CallEndpointWithQueryString("?first_name=ciaso&last_name=sell");
            var statusCode = response.Result.StatusCode;

            statusCode.Should().Be(200);

            var convertedResponse = await DeserializeResponse(response.Result).ConfigureAwait(true);

            convertedResponse.Residents.Count.Should().Be(1);
            convertedResponse.Residents.Should().ContainEquivalentOf(expectedResidentResponseOne);
        }
        public async Task GetResidentInformationByIdReturn200()
        {
            var residentId       = _fixture.Create <int>();
            var expectedResponse = E2ETestsHelper.AddPersonWithRelatedEntitiesToDb(ResidentContactContext, residentId);
            var uri        = new Uri($"api/v1/contacts/{residentId}", UriKind.Relative);
            var response   = Client.GetAsync(uri);
            var statuscode = response.Result.StatusCode;

            statuscode.Should().Be(200);

            var content       = response.Result.Content;
            var stringContent = await content.ReadAsStringAsync().ConfigureAwait(true);

            var convertedResponse = JsonConvert.DeserializeObject <ResidentResponse>(stringContent);

            convertedResponse.Should().BeEquivalentTo(expectedResponse);
        }
        public async Task WithNoCursorAndLimitWillReturnTheFirstPageOfResidentsWithTheNextCursor()
        {
            var allSavedResidents = Enumerable.Range(0, 25)
                                    .Select(r =>
                                            E2ETestsHelper
                                            .AddPersonWithRelatedEntitiesToDb(ResidentContactContext, r + 1))
                                    .ToList();

            var response = await CallEndpointWithQueryString().ConfigureAwait(true);

            response.StatusCode.Should().Be(200);

            var returnedResidents = await DeserializeResponse(response).ConfigureAwait(true);

            returnedResidents.Residents.Should().BeEquivalentTo(allSavedResidents.Take(20));

            returnedResidents.NextCursor.Should().Be("20");
        }
        public async Task IfNoQueryParametersReturnsAllResidentRecords()
        {
            var expectedResidentResponseOne   = E2ETestsHelper.AddPersonWithRelatedEntitiesToDb(ResidentContactContext);
            var expectedResidentResponseTwo   = E2ETestsHelper.AddPersonWithRelatedEntitiesToDb(ResidentContactContext);
            var expectedResidentResponseThree = E2ETestsHelper.AddPersonWithRelatedEntitiesToDb(ResidentContactContext);

            var response = CallEndpointWithQueryString();

            var statusCode = response.Result.StatusCode;

            statusCode.Should().Be(200);

            var convertedResponse = await DeserializeResponse(response.Result).ConfigureAwait(true);

            convertedResponse.Residents.Should().ContainEquivalentOf(expectedResidentResponseOne);
            convertedResponse.Residents.Should().ContainEquivalentOf(expectedResidentResponseTwo);
            convertedResponse.Residents.Should().ContainEquivalentOf(expectedResidentResponseThree);
        }
        public async Task Returns201IfNewContactRecordIsCreatedForResident()
        {
            var contactRequest = new ResidentContact
            {
                SubtypeId = _faker.Random.Int(1, 50),
                TypeId    = _faker.Random.Int(1, 50),
                Value     = "test@test",
                Active    = _faker.Random.Bool(),
                Default   = _faker.Random.Bool()
            };


            var resident = E2ETestsHelper.AddPersonWithRelatedEntitiesToDb(ResidentContactContext,
                                                                           contactTypeLookupId: contactRequest.TypeId,
                                                                           contactSubTypeLookupId: contactRequest.SubtypeId);

            contactRequest.ResidentId = resident.Id;
            var response = await CallPostEndpointWithRequest(contactRequest).ConfigureAwait(true);

            response.StatusCode.Should().Be(201);
            CheckContactHasBeSavedInDatabaseForResidentId(resident.Id, contactRequest);
        }
        public async Task CanCreateANewContactDetailGivenAnExternalContactIdToIdentifyTheResident()
        {
            var contactRequest = new ResidentContact
            {
                SubtypeId = _faker.Random.Int(1, 50),
                TypeId    = _faker.Random.Int(1, 50),
                Value     = "test@test",
                Active    = _faker.Random.Bool(),
                Default   = _faker.Random.Bool()
            };


            var resident = E2ETestsHelper.AddPersonWithRelatedEntitiesToDb(ResidentContactContext,
                                                                           contactTypeLookupId: contactRequest.TypeId,
                                                                           contactSubTypeLookupId: contactRequest.SubtypeId);

            contactRequest.NccContactId = E2ETestsHelper.AddCrmContactIdForResidentId(ResidentContactContext, resident.Id).ExternalIdValue;

            var response = await CallPostEndpointWithRequest(contactRequest).ConfigureAwait(true);

            response.StatusCode.Should().Be(201);
            CheckContactHasBeSavedInDatabaseForResidentId(resident.Id, contactRequest);
        }