private async Task <Application> CreateDefaultApplication()
        {
            User user = await GetCurrentUser();

            Account currentAccount = await GetAccountForCurrentUser();

            var request = new HttpRequestMessage(HttpMethod.Post, $"/api/Application/AuthorizedOwner");

            Application viewmodel_application = SecurityHelper.CreateNewApplication(currentAccount);

            var jsonString = JsonConvert.SerializeObject(viewmodel_application);

            request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");

            var response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // parse as JSON.
            jsonString = await response.Content.ReadAsStringAsync();

            Application responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);

            Assert.Equal("Testing", responseViewModel.mainbusinessfocus);
            Assert.Equal("Automated Testing", responseViewModel.manufacturingprocessdescription);
            return(responseViewModel);
        }
        /// <summary>
        /// Create a new Application for testing, using the passed account.
        /// </summary>
        /// <param name="currentAccount">Non-null account to use when creating the Application</param>
        /// <returns>The GUID of the created Application</returns>
        protected async Task <Guid> CreateNewApplicationGuid(ViewModels.Account currentAccount)
        {
            var request = new HttpRequestMessage(HttpMethod.Post, "/api/Application/Waiver");

            ViewModels.Application viewmodel_application = SecurityHelper.CreateNewApplication(currentAccount);

            var jsonString = JsonConvert.SerializeObject(viewmodel_application);

            request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");

            var response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // parse as JSON.
            jsonString = await response.Content.ReadAsStringAsync();

            ViewModels.Application responseViewModel = JsonConvert.DeserializeObject <ViewModels.Application>(jsonString);

            return(new Guid(responseViewModel.id));
        }
        public async System.Threading.Tasks.Task TestCustomAddress()
        {
            string initialName = randomNewUserName("Application Initial Name ", 6);
            string changedName = randomNewUserName("Application Changed Name ", 6);
            string service     = "Application";

            DateTimeOffset dto = DateTimeOffset.Now;

            // login as default and get account for current user
            var loginUser1 = randomNewUserName("TestAccountUser", 6);
            var strId      = await LoginAndRegisterAsNewUser(loginUser1);

            User user = await GetCurrentUser();

            Account currentAccount = await GetAccountForCurrentUser();

            // C - Create
            var request = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/Equipment Notification");

            Application viewmodel_application = SecurityHelper.CreateNewApplication(currentAccount);

            string[] stringsToMatch = new string[65];
            for (int i = 0; i < stringsToMatch.Length; i++)
            {
                stringsToMatch[i] = RandomTextString(20, i);
            }

            viewmodel_application.BCSellersAddress = new CustomAddress()
            {
                StreetLine1 = stringsToMatch[1],
                StreetLine2 = stringsToMatch[2],
                StreetLine3 = stringsToMatch[3],
                City        = stringsToMatch[4],
                Province    = stringsToMatch[5],
                Postalcode  = stringsToMatch[6],
                Country     = stringsToMatch[7]
            };

            viewmodel_application.OutsideBCSellersAddress = new CustomAddress()
            {
                StreetLine1 = stringsToMatch[11],
                StreetLine2 = stringsToMatch[12],
                StreetLine3 = stringsToMatch[13],
                City        = stringsToMatch[14],
                Province    = stringsToMatch[15],
                Postalcode  = stringsToMatch[16],
                Country     = stringsToMatch[17]
            };

            viewmodel_application.ImportersAddress = new CustomAddress()
            {
                StreetLine1 = stringsToMatch[21],
                StreetLine2 = stringsToMatch[22],
                StreetLine3 = stringsToMatch[23],
                City        = stringsToMatch[24],
                Province    = stringsToMatch[25],
                Postalcode  = stringsToMatch[26],
                Country     = stringsToMatch[27]
            };

            viewmodel_application.OriginatingSellersAddress = new CustomAddress()
            {
                StreetLine1 = stringsToMatch[31],
                StreetLine2 = stringsToMatch[32],
                StreetLine3 = stringsToMatch[33],
                City        = stringsToMatch[34],
                Province    = stringsToMatch[35],
                Postalcode  = stringsToMatch[36],
                Country     = stringsToMatch[37]
            };

            viewmodel_application.AddressofBusinessthathasGivenorLoaned = new CustomAddress()
            {
                StreetLine1 = stringsToMatch[41],
                StreetLine2 = stringsToMatch[42],
                StreetLine3 = stringsToMatch[43],
                City        = stringsToMatch[44],
                Province    = stringsToMatch[45],
                Postalcode  = stringsToMatch[46],
                Country     = stringsToMatch[47]
            };

            viewmodel_application.AddressofBusinessThatHasRentedorLeased = new CustomAddress()
            {
                StreetLine1 = stringsToMatch[51],
                StreetLine2 = stringsToMatch[52],
                StreetLine3 = stringsToMatch[53],
                City        = stringsToMatch[54],
                Province    = stringsToMatch[55],
                Postalcode  = stringsToMatch[56],
                Country     = stringsToMatch[57]
            };



            var jsonString = JsonConvert.SerializeObject(viewmodel_application);

            request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");

            var response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // parse as JSON.
            jsonString = await response.Content.ReadAsStringAsync();

            Application responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);

            Assert.Equal("Testing", responseViewModel.mainbusinessfocus);
            Assert.Equal("Automated Testing", responseViewModel.manufacturingprocessdescription);


            Guid id = new Guid(responseViewModel.id);

            //return;
            // R - Read
            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            jsonString = await response.Content.ReadAsStringAsync();

            responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);

            Assert.Equal("Testing", responseViewModel.mainbusinessfocus);
            Assert.Equal("Automated Testing", responseViewModel.manufacturingprocessdescription);

            CheckAddress(responseViewModel.BCSellersAddress, stringsToMatch[1],
                         stringsToMatch[2], stringsToMatch[3], stringsToMatch[4],
                         stringsToMatch[5], stringsToMatch[6], stringsToMatch[7]
                         );

            CheckAddress(responseViewModel.OutsideBCSellersAddress, stringsToMatch[11],
                         stringsToMatch[12], stringsToMatch[13], stringsToMatch[14],
                         stringsToMatch[15], stringsToMatch[16], stringsToMatch[17]
                         );

            CheckAddress(responseViewModel.ImportersAddress, stringsToMatch[21],
                         stringsToMatch[22], stringsToMatch[23], stringsToMatch[24],
                         stringsToMatch[25], stringsToMatch[26], stringsToMatch[27]
                         );

            CheckAddress(responseViewModel.OriginatingSellersAddress, stringsToMatch[31],
                         stringsToMatch[32], stringsToMatch[33], stringsToMatch[34],
                         stringsToMatch[35], stringsToMatch[36], stringsToMatch[37]
                         );

            CheckAddress(responseViewModel.AddressofBusinessthathasGivenorLoaned, stringsToMatch[41],
                         stringsToMatch[42], stringsToMatch[43], stringsToMatch[44],
                         stringsToMatch[45], stringsToMatch[46], stringsToMatch[47]
                         );

            CheckAddress(responseViewModel.AddressofBusinessThatHasRentedorLeased, stringsToMatch[51],
                         stringsToMatch[52], stringsToMatch[53], stringsToMatch[54],
                         stringsToMatch[55], stringsToMatch[56], stringsToMatch[57]
                         );

            Assert.True(responseViewModel.applicant != null);
            Assert.Equal(currentAccount.id, responseViewModel.applicant.id);


            // U - Update
            viewmodel_application = new Application();
            viewmodel_application.mainbusinessfocus = changedName;

            // test update with existing addresses

            for (int i = 0; i < stringsToMatch.Length; i++)
            {
                stringsToMatch[i] = RandomTextString(20, i);
            }

            viewmodel_application.BCSellersAddress = new CustomAddress()
            {
                Id          = responseViewModel.BCSellersAddress.Id,
                StreetLine1 = stringsToMatch[1],
                StreetLine2 = stringsToMatch[2],
                StreetLine3 = stringsToMatch[3],
                City        = stringsToMatch[4],
                Province    = stringsToMatch[5],
                Postalcode  = stringsToMatch[6],
                Country     = stringsToMatch[7]
            };

            viewmodel_application.OutsideBCSellersAddress = new CustomAddress()
            {
                Id          = responseViewModel.OutsideBCSellersAddress.Id,
                StreetLine1 = stringsToMatch[11],
                StreetLine2 = stringsToMatch[12],
                StreetLine3 = stringsToMatch[13],
                City        = stringsToMatch[14],
                Province    = stringsToMatch[15],
                Postalcode  = stringsToMatch[16],
                Country     = stringsToMatch[17]
            };

            viewmodel_application.ImportersAddress = new CustomAddress()
            {
                Id          = responseViewModel.ImportersAddress.Id,
                StreetLine1 = stringsToMatch[21],
                StreetLine2 = stringsToMatch[22],
                StreetLine3 = stringsToMatch[23],
                City        = stringsToMatch[24],
                Province    = stringsToMatch[25],
                Postalcode  = stringsToMatch[26],
                Country     = stringsToMatch[27]
            };

            viewmodel_application.OriginatingSellersAddress = new CustomAddress()
            {
                Id          = responseViewModel.OriginatingSellersAddress.Id,
                StreetLine1 = stringsToMatch[31],
                StreetLine2 = stringsToMatch[32],
                StreetLine3 = stringsToMatch[33],
                City        = stringsToMatch[34],
                Province    = stringsToMatch[35],
                Postalcode  = stringsToMatch[36],
                Country     = stringsToMatch[37]
            };

            viewmodel_application.AddressofBusinessthathasGivenorLoaned = new CustomAddress()
            {
                Id          = responseViewModel.AddressofBusinessthathasGivenorLoaned.Id,
                StreetLine1 = stringsToMatch[41],
                StreetLine2 = stringsToMatch[42],
                StreetLine3 = stringsToMatch[43],
                City        = stringsToMatch[44],
                Province    = stringsToMatch[45],
                Postalcode  = stringsToMatch[46],
                Country     = stringsToMatch[47]
            };

            viewmodel_application.AddressofBusinessThatHasRentedorLeased = new CustomAddress()
            {
                Id          = responseViewModel.AddressofBusinessThatHasRentedorLeased.Id,
                StreetLine1 = stringsToMatch[51],
                StreetLine2 = stringsToMatch[52],
                StreetLine3 = stringsToMatch[53],
                City        = stringsToMatch[54],
                Province    = stringsToMatch[55],
                Postalcode  = stringsToMatch[56],
                Country     = stringsToMatch[57]
            };


            request = new HttpRequestMessage(HttpMethod.Put, "/api/" + service + "/" + id)
            {
                Content = new StringContent(JsonConvert.SerializeObject(viewmodel_application), Encoding.UTF8, "application/json")
            };
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // verify that the update persisted.

            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            jsonString = await response.Content.ReadAsStringAsync();

            responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);
            Assert.Equal(changedName, responseViewModel.mainbusinessfocus);

            CheckAddress(responseViewModel.BCSellersAddress, stringsToMatch[1],
                         stringsToMatch[2], stringsToMatch[3], stringsToMatch[4],
                         stringsToMatch[5], stringsToMatch[6], stringsToMatch[7]
                         );

            CheckAddress(responseViewModel.OutsideBCSellersAddress, stringsToMatch[11],
                         stringsToMatch[12], stringsToMatch[13], stringsToMatch[14],
                         stringsToMatch[15], stringsToMatch[16], stringsToMatch[17]
                         );

            CheckAddress(responseViewModel.ImportersAddress, stringsToMatch[21],
                         stringsToMatch[22], stringsToMatch[23], stringsToMatch[24],
                         stringsToMatch[25], stringsToMatch[26], stringsToMatch[27]
                         );

            CheckAddress(responseViewModel.OriginatingSellersAddress, stringsToMatch[31],
                         stringsToMatch[32], stringsToMatch[33], stringsToMatch[34],
                         stringsToMatch[35], stringsToMatch[36], stringsToMatch[37]
                         );

            CheckAddress(responseViewModel.AddressofBusinessthathasGivenorLoaned, stringsToMatch[41],
                         stringsToMatch[42], stringsToMatch[43], stringsToMatch[44],
                         stringsToMatch[45], stringsToMatch[46], stringsToMatch[47]
                         );

            CheckAddress(responseViewModel.AddressofBusinessThatHasRentedorLeased, stringsToMatch[51],
                         stringsToMatch[52], stringsToMatch[53], stringsToMatch[54],
                         stringsToMatch[55], stringsToMatch[56], stringsToMatch[57]
                         );


            // U - Update
            viewmodel_application = new Application();
            viewmodel_application.mainbusinessfocus = changedName;

            // test update with new addresses

            for (int i = 0; i < stringsToMatch.Length; i++)
            {
                stringsToMatch[i] = RandomTextString(20, i);
            }

            viewmodel_application.BCSellersAddress = new CustomAddress()
            {
                StreetLine1 = stringsToMatch[1],
                StreetLine2 = stringsToMatch[2],
                StreetLine3 = stringsToMatch[3],
                City        = stringsToMatch[4],
                Province    = stringsToMatch[5],
                Postalcode  = stringsToMatch[6],
                Country     = stringsToMatch[7]
            };

            viewmodel_application.OutsideBCSellersAddress = new CustomAddress()
            {
                StreetLine1 = stringsToMatch[11],
                StreetLine2 = stringsToMatch[12],
                StreetLine3 = stringsToMatch[13],
                City        = stringsToMatch[14],
                Province    = stringsToMatch[15],
                Postalcode  = stringsToMatch[16],
                Country     = stringsToMatch[17]
            };

            viewmodel_application.ImportersAddress = new CustomAddress()
            {
                StreetLine1 = stringsToMatch[21],
                StreetLine2 = stringsToMatch[22],
                StreetLine3 = stringsToMatch[23],
                City        = stringsToMatch[24],
                Province    = stringsToMatch[25],
                Postalcode  = stringsToMatch[26],
                Country     = stringsToMatch[27]
            };

            viewmodel_application.OriginatingSellersAddress = new CustomAddress()
            {
                StreetLine1 = stringsToMatch[31],
                StreetLine2 = stringsToMatch[32],
                StreetLine3 = stringsToMatch[33],
                City        = stringsToMatch[34],
                Province    = stringsToMatch[35],
                Postalcode  = stringsToMatch[36],
                Country     = stringsToMatch[37]
            };

            viewmodel_application.AddressofBusinessthathasGivenorLoaned = new CustomAddress()
            {
                StreetLine1 = stringsToMatch[41],
                StreetLine2 = stringsToMatch[42],
                StreetLine3 = stringsToMatch[43],
                City        = stringsToMatch[44],
                Province    = stringsToMatch[45],
                Postalcode  = stringsToMatch[46],
                Country     = stringsToMatch[47]
            };

            viewmodel_application.AddressofBusinessThatHasRentedorLeased = new CustomAddress()
            {
                StreetLine1 = stringsToMatch[51],
                StreetLine2 = stringsToMatch[52],
                StreetLine3 = stringsToMatch[53],
                City        = stringsToMatch[54],
                Province    = stringsToMatch[55],
                Postalcode  = stringsToMatch[56],
                Country     = stringsToMatch[57]
            };


            request = new HttpRequestMessage(HttpMethod.Put, "/api/" + service + "/" + id)
            {
                Content = new StringContent(JsonConvert.SerializeObject(viewmodel_application), Encoding.UTF8, "application/json")
            };
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // verify that the update persisted.

            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            jsonString = await response.Content.ReadAsStringAsync();

            response.EnsureSuccessStatusCode();
            responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);
            Assert.Equal(changedName, responseViewModel.mainbusinessfocus);

            CheckAddress(responseViewModel.BCSellersAddress, stringsToMatch[1],
                         stringsToMatch[2], stringsToMatch[3], stringsToMatch[4],
                         stringsToMatch[5], stringsToMatch[6], stringsToMatch[7]
                         );

            CheckAddress(responseViewModel.OutsideBCSellersAddress, stringsToMatch[11],
                         stringsToMatch[12], stringsToMatch[13], stringsToMatch[14],
                         stringsToMatch[15], stringsToMatch[16], stringsToMatch[17]
                         );

            CheckAddress(responseViewModel.ImportersAddress, stringsToMatch[21],
                         stringsToMatch[22], stringsToMatch[23], stringsToMatch[24],
                         stringsToMatch[25], stringsToMatch[26], stringsToMatch[27]
                         );

            CheckAddress(responseViewModel.OriginatingSellersAddress, stringsToMatch[31],
                         stringsToMatch[32], stringsToMatch[33], stringsToMatch[34],
                         stringsToMatch[35], stringsToMatch[36], stringsToMatch[37]
                         );

            CheckAddress(responseViewModel.AddressofBusinessthathasGivenorLoaned, stringsToMatch[41],
                         stringsToMatch[42], stringsToMatch[43], stringsToMatch[44],
                         stringsToMatch[45], stringsToMatch[46], stringsToMatch[47]
                         );

            CheckAddress(responseViewModel.AddressofBusinessThatHasRentedorLeased, stringsToMatch[51],
                         stringsToMatch[52], stringsToMatch[53], stringsToMatch[54],
                         stringsToMatch[55], stringsToMatch[56], stringsToMatch[57]
                         );

            // D - Delete

            request  = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/" + id + "/delete");
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // second delete should return a 404.
            request  = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/" + id + "/delete");
            response = await _client.SendAsync(request);

            Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);

            // should get a 404 if we try a get now.
            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);

            // logout and cleanup (deletes the account and contact created above ^^^)
            await LogoutAndCleanupTestUser(strId);
        }
        public async System.Threading.Tasks.Task TestCRUD()
        {
            string initialName = randomNewUserName("Application Initial Name ", 6);
            string changedName = randomNewUserName("Application Changed Name ", 6);
            string service     = "Application";

            string initialPhoneNumber = "3331112222";
            string changedPhoneNumber = "1111112222";

            DateTimeOffset dto = DateTimeOffset.Now;

            // login as default and get account for current user
            var loginUser1 = randomNewUserName("TestAccountUser", 6);
            var strId      = await LoginAndRegisterAsNewUser(loginUser1);

            User user = await GetCurrentUser();

            Account currentAccount = await GetAccountForCurrentUser();

            // C - Create
            var request = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/Equipment Notification");

            Application viewmodel_application = SecurityHelper.CreateNewApplication(currentAccount);

            string[] stringsToMatch = new string[35];
            for (int i = 0; i < stringsToMatch.Length; i++)
            {
                stringsToMatch[i] = RandomTextString(20, i);
            }

            // setup the equipment fields.
            viewmodel_application.EquipmentType      = Equipmenttype.DieMouldorPunch;
            viewmodel_application.EquipmentTypeOther = stringsToMatch[0];

            viewmodel_application.PillpressEncapsulatorSizeOtherCheck = true;
            viewmodel_application.PillpressEncapsulatorSizeOther      = stringsToMatch[1];

            viewmodel_application.ExplanationOfEquipmentUse = stringsToMatch[2];

            viewmodel_application.HowWasEquipmentBuiltOtherCheck = true;
            viewmodel_application.HowWasEquipmentBuiltOther      = stringsToMatch[3];
            viewmodel_application.NameOfManufacturer             = stringsToMatch[4];
            viewmodel_application.EquipmentMake  = stringsToMatch[5];
            viewmodel_application.EquipmentModel = stringsToMatch[6];
            viewmodel_application.SerialNumber   = stringsToMatch[7];
            viewmodel_application.HowEquipmentBuiltDescription     = stringsToMatch[8];
            viewmodel_application.PersonBusinessThatBuiltEquipment = stringsToMatch[9];
            viewmodel_application.SerialNumberForCustomBuilt       = true;
            viewmodel_application.CustomBuiltSerialNumber          = stringsToMatch[10];
            viewmodel_application.SerialNumberKeyPartDescription   = stringsToMatch[11];
            viewmodel_application.OwnedBeforeJan2019              = true;
            viewmodel_application.PurchasedFromBcSeller           = true;
            viewmodel_application.PurchasedFromSellerOutsideofBc  = true;
            viewmodel_application.ImportedToBcByAThirdParty       = true;
            viewmodel_application.AlternativeOwnershipArrangement = true;
            viewmodel_application.IAssembledItMyself              = true;
            viewmodel_application.HowCameIntoPossessionOtherCheck = true;
            viewmodel_application.HowCameIntoPossessionOther      = stringsToMatch[12];
            viewmodel_application.NameOfBcSeller                    = stringsToMatch[13];
            viewmodel_application.Dateofpurchasefrombcseller        = dto;
            viewmodel_application.BcSellersRegistrationNumber       = stringsToMatch[14];
            viewmodel_application.BcSellersContactPhoneNumber       = initialPhoneNumber;
            viewmodel_application.BcSellersContactEmail             = stringsToMatch[16];
            viewmodel_application.OutsideBcSellersName              = stringsToMatch[17];
            viewmodel_application.DateOfPurchaseFromOutsideBcSeller = dto;
            viewmodel_application.NameOfImporter                    = stringsToMatch[18];
            viewmodel_application.ImportersRegistrationNumber       = stringsToMatch[19];
            viewmodel_application.Nameoforiginatingseller           = stringsToMatch[20];

            viewmodel_application.DateOfPurchaseFromImporter          = dto;
            viewmodel_application.PossessUntilICanSell                = true;
            viewmodel_application.GiveNorLoanedToMe                   = true;
            viewmodel_application.RentingOrLeasingFromAnotherBusiness = true;
            viewmodel_application.KindOfAlternateOwnershipOtherCheck  = true;
            viewmodel_application.KindOfAlternateOwnershipOther       = stringsToMatch[21];
            viewmodel_application.UsingToManufactureAProduct          = true;
            viewmodel_application.AreYouARegisteredSeller             = true;
            viewmodel_application.NameOfBusinessThatHasGivenOrLoaned  = stringsToMatch[22];

            viewmodel_application.PhoneOfBusinessThatHasGivenOrLoaned    = initialPhoneNumber;
            viewmodel_application.EmailOfTheBusinessThatHasGivenOrLoaned = stringsToMatch[24];
            viewmodel_application.WhyAHaveYouAcceptedOrBorrowed          = stringsToMatch[25];
            viewmodel_application.NameOfBusinessThatHasRentedOrLeased    = stringsToMatch[26];

            viewmodel_application.PhoneOfBusinessThatHasRentedOrLeased = initialPhoneNumber;
            viewmodel_application.EmailOfBusinessThatHasRentedOrLeased = stringsToMatch[28];
            viewmodel_application.WhyHaveYouRentedOrLeased             = stringsToMatch[29];
            viewmodel_application.WhenDidYouAssembleEquipment          = dto;
            viewmodel_application.WhereDidYouObtainParts                  = stringsToMatch[30];
            viewmodel_application.DoYouAssembleForOtherBusinesses         = true;
            viewmodel_application.DetailsOfAssemblyForOtherBusinesses     = stringsToMatch[31];
            viewmodel_application.DetailsOfHowEquipmentCameIntoPossession = stringsToMatch[32];
            viewmodel_application.DeclarationOfCorrectInformation         = true;
            viewmodel_application.ConfirmationOfAuthorizedUse             = true;

            viewmodel_application.SubmittedDate = dto;

            viewmodel_application.LevelOfEquipmentAutomation = Levelofequipmentautomation.Automated;
            viewmodel_application.PillpressEncapsulatorSize  = Pillpressencapsulatorsize.FreeStandingModel;
            viewmodel_application.PillpressMaxCapacity       = 1000;
            viewmodel_application.EncapsulatorMaxCapacity    = 1000;
            viewmodel_application.HowWasEquipmentBuilt       = Howwasequipmentbuilt.CommerciallyManufactured;

            var jsonString = JsonConvert.SerializeObject(viewmodel_application);

            request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");

            var response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // parse as JSON.
            jsonString = await response.Content.ReadAsStringAsync();

            Application responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);

            Assert.Equal("Testing", responseViewModel.mainbusinessfocus);
            Assert.Equal("Automated Testing", responseViewModel.manufacturingprocessdescription);


            Guid id = new Guid(responseViewModel.id);

            //return;
            // R - Read
            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            jsonString = await response.Content.ReadAsStringAsync();

            responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);

            Assert.Equal("Testing", responseViewModel.mainbusinessfocus);
            Assert.Equal("Automated Testing", responseViewModel.manufacturingprocessdescription);


            Assert.True(responseViewModel.applicant != null);
            Assert.Equal(currentAccount.id, responseViewModel.applicant.id);

            Assert.Equal(Equipmenttype.DieMouldorPunch, responseViewModel.EquipmentType);
            Assert.Equal(responseViewModel.EquipmentTypeOther, stringsToMatch[0]);


            Assert.True(responseViewModel.PillpressEncapsulatorSizeOtherCheck);
            Assert.Equal(responseViewModel.PillpressEncapsulatorSizeOther, stringsToMatch[1]);

            Assert.Equal(responseViewModel.ExplanationOfEquipmentUse, stringsToMatch[2]);

            Assert.True(responseViewModel.HowWasEquipmentBuiltOtherCheck);
            Assert.Equal(responseViewModel.HowWasEquipmentBuiltOther, stringsToMatch[3]);
            Assert.Equal(responseViewModel.NameOfManufacturer, stringsToMatch[4]);
            Assert.Equal(responseViewModel.EquipmentMake, stringsToMatch[5]);
            Assert.Equal(responseViewModel.EquipmentModel, stringsToMatch[6]);
            Assert.Equal(responseViewModel.SerialNumber, stringsToMatch[7]);
            Assert.Equal(responseViewModel.HowEquipmentBuiltDescription, stringsToMatch[8]);
            Assert.Equal(responseViewModel.PersonBusinessThatBuiltEquipment, stringsToMatch[9]);
            Assert.True(responseViewModel.SerialNumberForCustomBuilt);
            Assert.Equal(responseViewModel.CustomBuiltSerialNumber, stringsToMatch[10]);
            Assert.Equal(responseViewModel.SerialNumberKeyPartDescription, stringsToMatch[11]);
            Assert.True(responseViewModel.OwnedBeforeJan2019);
            Assert.True(responseViewModel.PurchasedFromBcSeller);
            Assert.True(responseViewModel.PurchasedFromSellerOutsideofBc);
            Assert.True(responseViewModel.ImportedToBcByAThirdParty);
            Assert.True(responseViewModel.AlternativeOwnershipArrangement);
            Assert.True(responseViewModel.IAssembledItMyself);
            Assert.True(responseViewModel.HowCameIntoPossessionOtherCheck);
            Assert.Equal(responseViewModel.HowCameIntoPossessionOther, stringsToMatch[12]);
            Assert.Equal(responseViewModel.NameOfBcSeller, stringsToMatch[13]);
            Assert.Equal(responseViewModel.Dateofpurchasefrombcseller.Value.Date, dto.Date);
            Assert.Equal(responseViewModel.BcSellersRegistrationNumber, stringsToMatch[14]);
            Assert.Equal(responseViewModel.BcSellersContactPhoneNumber, initialPhoneNumber);
            Assert.Equal(responseViewModel.BcSellersContactEmail, stringsToMatch[16]);
            Assert.Equal(responseViewModel.OutsideBcSellersName, stringsToMatch[17]);
            Assert.Equal(responseViewModel.DateOfPurchaseFromOutsideBcSeller.Value.Date, dto.Date);
            Assert.Equal(responseViewModel.NameOfImporter, stringsToMatch[18]);
            Assert.Equal(responseViewModel.ImportersRegistrationNumber, stringsToMatch[19]);
            Assert.Equal(responseViewModel.Nameoforiginatingseller, stringsToMatch[20]);

            Assert.Equal(responseViewModel.DateOfPurchaseFromImporter.Value.Date, dto.Date);
            Assert.True(responseViewModel.PossessUntilICanSell);
            Assert.True(responseViewModel.GiveNorLoanedToMe);
            Assert.True(responseViewModel.RentingOrLeasingFromAnotherBusiness);
            Assert.True(responseViewModel.KindOfAlternateOwnershipOtherCheck);
            Assert.Equal(responseViewModel.KindOfAlternateOwnershipOther, stringsToMatch[21]);
            Assert.True(responseViewModel.UsingToManufactureAProduct);
            Assert.True(responseViewModel.AreYouARegisteredSeller);
            Assert.Equal(responseViewModel.NameOfBusinessThatHasGivenOrLoaned, stringsToMatch[22]);

            Assert.Equal(responseViewModel.PhoneOfBusinessThatHasGivenOrLoaned, initialPhoneNumber);
            Assert.Equal(responseViewModel.EmailOfTheBusinessThatHasGivenOrLoaned, stringsToMatch[24]);
            Assert.Equal(responseViewModel.WhyAHaveYouAcceptedOrBorrowed, stringsToMatch[25]);
            Assert.Equal(responseViewModel.NameOfBusinessThatHasRentedOrLeased, stringsToMatch[26]);

            Assert.Equal(responseViewModel.PhoneOfBusinessThatHasRentedOrLeased, initialPhoneNumber);
            Assert.Equal(responseViewModel.EmailOfBusinessThatHasRentedOrLeased, stringsToMatch[28]);
            Assert.Equal(responseViewModel.WhyHaveYouRentedOrLeased, stringsToMatch[29]);
            Assert.Equal(responseViewModel.WhenDidYouAssembleEquipment.Value.Date, dto.Date);
            Assert.Equal(responseViewModel.WhereDidYouObtainParts, stringsToMatch[30]);
            Assert.True(responseViewModel.DoYouAssembleForOtherBusinesses);
            Assert.Equal(responseViewModel.DetailsOfAssemblyForOtherBusinesses, stringsToMatch[31]);
            Assert.Equal(responseViewModel.DetailsOfHowEquipmentCameIntoPossession, stringsToMatch[32]);
            Assert.True(responseViewModel.DeclarationOfCorrectInformation);
            Assert.True(responseViewModel.ConfirmationOfAuthorizedUse);

            Assert.Equal(responseViewModel.SubmittedDate.Value.Date, dto.Date);

            Assert.Equal(Levelofequipmentautomation.Automated, responseViewModel.LevelOfEquipmentAutomation);
            Assert.Equal(Pillpressencapsulatorsize.FreeStandingModel, responseViewModel.PillpressEncapsulatorSize);
            Assert.Equal(1000, responseViewModel.PillpressMaxCapacity);
            Assert.Equal(1000, responseViewModel.EncapsulatorMaxCapacity);
            Assert.Equal(Howwasequipmentbuilt.CommerciallyManufactured, responseViewModel.HowWasEquipmentBuilt);

            // U - Update
            viewmodel_application = new Application();
            viewmodel_application.mainbusinessfocus = changedName;

            // randomize the strings to match
            for (int i = 0; i < stringsToMatch.Length; i++)
            {
                stringsToMatch[i] = RandomTextString(20, i);
            }
            dto.AddYears(-1);
            viewmodel_application.EquipmentType      = Equipmenttype.Encapsulator;
            viewmodel_application.EquipmentTypeOther = stringsToMatch[0];

            viewmodel_application.PillpressEncapsulatorSizeOtherCheck = false;
            viewmodel_application.PillpressEncapsulatorSizeOther      = stringsToMatch[1];

            viewmodel_application.ExplanationOfEquipmentUse = stringsToMatch[2];

            viewmodel_application.HowWasEquipmentBuiltOtherCheck = false;
            viewmodel_application.HowWasEquipmentBuiltOther      = stringsToMatch[3];
            viewmodel_application.NameOfManufacturer             = stringsToMatch[4];
            viewmodel_application.EquipmentMake  = stringsToMatch[5];
            viewmodel_application.EquipmentModel = stringsToMatch[6];
            viewmodel_application.SerialNumber   = stringsToMatch[7];
            viewmodel_application.HowEquipmentBuiltDescription     = stringsToMatch[8];
            viewmodel_application.PersonBusinessThatBuiltEquipment = stringsToMatch[9];
            viewmodel_application.SerialNumberForCustomBuilt       = false;
            viewmodel_application.CustomBuiltSerialNumber          = stringsToMatch[10];
            viewmodel_application.SerialNumberKeyPartDescription   = stringsToMatch[11];
            viewmodel_application.OwnedBeforeJan2019              = false;
            viewmodel_application.PurchasedFromBcSeller           = false;
            viewmodel_application.PurchasedFromSellerOutsideofBc  = false;
            viewmodel_application.ImportedToBcByAThirdParty       = false;
            viewmodel_application.AlternativeOwnershipArrangement = false;
            viewmodel_application.IAssembledItMyself              = false;
            viewmodel_application.HowCameIntoPossessionOtherCheck = false;
            viewmodel_application.HowCameIntoPossessionOther      = stringsToMatch[12];
            viewmodel_application.NameOfBcSeller                    = stringsToMatch[13];
            viewmodel_application.Dateofpurchasefrombcseller        = dto;
            viewmodel_application.BcSellersRegistrationNumber       = stringsToMatch[14];
            viewmodel_application.BcSellersContactPhoneNumber       = changedPhoneNumber;
            viewmodel_application.BcSellersContactEmail             = stringsToMatch[16];
            viewmodel_application.OutsideBcSellersName              = stringsToMatch[17];
            viewmodel_application.DateOfPurchaseFromOutsideBcSeller = dto;
            viewmodel_application.NameOfImporter                    = stringsToMatch[18];
            viewmodel_application.ImportersRegistrationNumber       = stringsToMatch[19];
            viewmodel_application.Nameoforiginatingseller           = stringsToMatch[20];

            viewmodel_application.DateOfPurchaseFromImporter          = dto;
            viewmodel_application.PossessUntilICanSell                = false;
            viewmodel_application.GiveNorLoanedToMe                   = false;
            viewmodel_application.RentingOrLeasingFromAnotherBusiness = false;
            viewmodel_application.KindOfAlternateOwnershipOtherCheck  = false;
            viewmodel_application.KindOfAlternateOwnershipOther       = stringsToMatch[21];
            viewmodel_application.UsingToManufactureAProduct          = false;
            viewmodel_application.AreYouARegisteredSeller             = false;
            viewmodel_application.NameOfBusinessThatHasGivenOrLoaned  = stringsToMatch[22];

            viewmodel_application.PhoneOfBusinessThatHasGivenOrLoaned    = changedPhoneNumber;
            viewmodel_application.EmailOfTheBusinessThatHasGivenOrLoaned = stringsToMatch[24];
            viewmodel_application.WhyAHaveYouAcceptedOrBorrowed          = stringsToMatch[25];
            viewmodel_application.NameOfBusinessThatHasRentedOrLeased    = stringsToMatch[26];

            viewmodel_application.PhoneOfBusinessThatHasRentedOrLeased = changedPhoneNumber;
            viewmodel_application.EmailOfBusinessThatHasRentedOrLeased = stringsToMatch[28];
            viewmodel_application.WhyHaveYouRentedOrLeased             = stringsToMatch[29];
            viewmodel_application.WhenDidYouAssembleEquipment          = dto;
            viewmodel_application.WhereDidYouObtainParts                  = stringsToMatch[30];
            viewmodel_application.DoYouAssembleForOtherBusinesses         = false;
            viewmodel_application.DetailsOfAssemblyForOtherBusinesses     = stringsToMatch[31];
            viewmodel_application.DetailsOfHowEquipmentCameIntoPossession = stringsToMatch[32];
            viewmodel_application.DeclarationOfCorrectInformation         = false;
            viewmodel_application.ConfirmationOfAuthorizedUse             = false;

            viewmodel_application.SubmittedDate = dto;

            viewmodel_application.LevelOfEquipmentAutomation = Levelofequipmentautomation.CapableofBeingAutomated;
            viewmodel_application.PillpressEncapsulatorSize  = Pillpressencapsulatorsize.IndustrialModel;
            viewmodel_application.PillpressMaxCapacity       = 1;
            viewmodel_application.EncapsulatorMaxCapacity    = 1;
            viewmodel_application.HowWasEquipmentBuilt       = Howwasequipmentbuilt.Custombuilt;


            request = new HttpRequestMessage(HttpMethod.Put, "/api/" + service + "/" + id)
            {
                Content = new StringContent(JsonConvert.SerializeObject(viewmodel_application), Encoding.UTF8, "application/json")
            };
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // verify that the update persisted.

            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            jsonString = await response.Content.ReadAsStringAsync();

            responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);
            Assert.Equal(changedName, responseViewModel.mainbusinessfocus);

            Assert.Equal(Equipmenttype.Encapsulator, responseViewModel.EquipmentType);
            Assert.Equal(responseViewModel.EquipmentTypeOther, stringsToMatch[0]);


            Assert.False(responseViewModel.PillpressEncapsulatorSizeOtherCheck);
            Assert.Equal(responseViewModel.PillpressEncapsulatorSizeOther, stringsToMatch[1]);

            Assert.Equal(responseViewModel.ExplanationOfEquipmentUse, stringsToMatch[2]);

            Assert.False(responseViewModel.HowWasEquipmentBuiltOtherCheck);
            Assert.Equal(responseViewModel.HowWasEquipmentBuiltOther, stringsToMatch[3]);
            Assert.Equal(responseViewModel.NameOfManufacturer, stringsToMatch[4]);
            Assert.Equal(responseViewModel.EquipmentMake, stringsToMatch[5]);
            Assert.Equal(responseViewModel.EquipmentModel, stringsToMatch[6]);
            Assert.Equal(responseViewModel.SerialNumber, stringsToMatch[7]);
            Assert.Equal(responseViewModel.HowEquipmentBuiltDescription, stringsToMatch[8]);
            Assert.Equal(responseViewModel.PersonBusinessThatBuiltEquipment, stringsToMatch[9]);
            Assert.False(responseViewModel.SerialNumberForCustomBuilt);
            Assert.Equal(responseViewModel.CustomBuiltSerialNumber, stringsToMatch[10]);
            Assert.Equal(responseViewModel.SerialNumberKeyPartDescription, stringsToMatch[11]);
            Assert.False(responseViewModel.OwnedBeforeJan2019);
            Assert.False(responseViewModel.PurchasedFromBcSeller);
            Assert.False(responseViewModel.PurchasedFromSellerOutsideofBc);
            Assert.False(responseViewModel.ImportedToBcByAThirdParty);
            Assert.False(responseViewModel.AlternativeOwnershipArrangement);
            Assert.False(responseViewModel.IAssembledItMyself);
            Assert.False(responseViewModel.HowCameIntoPossessionOtherCheck);
            Assert.Equal(responseViewModel.HowCameIntoPossessionOther, stringsToMatch[12]);
            Assert.Equal(responseViewModel.NameOfBcSeller, stringsToMatch[13]);
            Assert.Equal(responseViewModel.Dateofpurchasefrombcseller.Value.Date, dto.Date);
            Assert.Equal(responseViewModel.BcSellersRegistrationNumber, stringsToMatch[14]);
            Assert.Equal(responseViewModel.BcSellersContactPhoneNumber, changedPhoneNumber);
            Assert.Equal(responseViewModel.BcSellersContactEmail, stringsToMatch[16]);
            Assert.Equal(responseViewModel.OutsideBcSellersName, stringsToMatch[17]);
            Assert.Equal(responseViewModel.DateOfPurchaseFromOutsideBcSeller.Value.Date, dto.Date);
            Assert.Equal(responseViewModel.NameOfImporter, stringsToMatch[18]);
            Assert.Equal(responseViewModel.ImportersRegistrationNumber, stringsToMatch[19]);
            Assert.Equal(responseViewModel.Nameoforiginatingseller, stringsToMatch[20]);

            Assert.Equal(responseViewModel.DateOfPurchaseFromImporter.Value.Date, dto.Date);
            Assert.False(responseViewModel.PossessUntilICanSell);
            Assert.False(responseViewModel.GiveNorLoanedToMe);
            Assert.False(responseViewModel.RentingOrLeasingFromAnotherBusiness);
            Assert.False(responseViewModel.KindOfAlternateOwnershipOtherCheck);
            Assert.Equal(responseViewModel.KindOfAlternateOwnershipOther, stringsToMatch[21]);
            Assert.False(responseViewModel.UsingToManufactureAProduct);
            Assert.False(responseViewModel.AreYouARegisteredSeller);
            Assert.Equal(responseViewModel.NameOfBusinessThatHasGivenOrLoaned, stringsToMatch[22]);

            Assert.Equal(responseViewModel.PhoneOfBusinessThatHasGivenOrLoaned, changedPhoneNumber);
            Assert.Equal(responseViewModel.EmailOfTheBusinessThatHasGivenOrLoaned, stringsToMatch[24]);
            Assert.Equal(responseViewModel.WhyAHaveYouAcceptedOrBorrowed, stringsToMatch[25]);
            Assert.Equal(responseViewModel.NameOfBusinessThatHasRentedOrLeased, stringsToMatch[26]);

            Assert.Equal(responseViewModel.PhoneOfBusinessThatHasRentedOrLeased, changedPhoneNumber);
            Assert.Equal(responseViewModel.EmailOfBusinessThatHasRentedOrLeased, stringsToMatch[28]);
            Assert.Equal(responseViewModel.WhyHaveYouRentedOrLeased, stringsToMatch[29]);
            Assert.Equal(responseViewModel.WhenDidYouAssembleEquipment.Value.Date, dto.Date);
            Assert.Equal(responseViewModel.WhereDidYouObtainParts, stringsToMatch[30]);
            Assert.False(responseViewModel.DoYouAssembleForOtherBusinesses);
            Assert.Equal(responseViewModel.DetailsOfAssemblyForOtherBusinesses, stringsToMatch[31]);
            Assert.Equal(responseViewModel.DetailsOfHowEquipmentCameIntoPossession, stringsToMatch[32]);
            Assert.False(responseViewModel.DeclarationOfCorrectInformation);
            Assert.False(responseViewModel.ConfirmationOfAuthorizedUse);

            Assert.Equal(responseViewModel.SubmittedDate.Value.Date, dto.Date);

            Assert.Equal(Levelofequipmentautomation.CapableofBeingAutomated, responseViewModel.LevelOfEquipmentAutomation);
            Assert.Equal(Pillpressencapsulatorsize.IndustrialModel, responseViewModel.PillpressEncapsulatorSize);
            Assert.Equal(1, responseViewModel.PillpressMaxCapacity);
            Assert.Equal(1, responseViewModel.EncapsulatorMaxCapacity);
            Assert.Equal(Howwasequipmentbuilt.Custombuilt, responseViewModel.HowWasEquipmentBuilt);

            // D - Delete

            request  = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/" + id + "/delete");
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // second delete should return a 404.
            request  = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/" + id + "/delete");
            response = await _client.SendAsync(request);

            Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);

            // should get a 404 if we try a get now.
            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);

            // logout and cleanup (deletes the account and contact created above ^^^)
            await LogoutAndCleanupTestUser(strId);
        }
        public async System.Threading.Tasks.Task Test25MbUploadFile()
        {
            // Create application
            string initialName = randomNewUserName("Application Initial Name ", 6);
            string changedName = randomNewUserName("Application Changed Name ", 6);
            string service     = "Application";

            // login as default and get account for current user
            string loginUser = randomNewUserName("TestAppUser_", 6);
            var    strId     = await LoginAndRegisterAsNewUser(loginUser);

            User user = await GetCurrentUser();

            Account currentAccount = await GetAccountForCurrentUser();

            var request = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/Waiver");

            Application viewmodel_application = SecurityHelper.CreateNewApplication(currentAccount);


            var jsonString = JsonConvert.SerializeObject(viewmodel_application);

            request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");

            var response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            jsonString = await response.Content.ReadAsStringAsync();

            Application responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);

            Assert.Equal("Testing", responseViewModel.mainbusinessfocus);
            Assert.Equal("Automated Testing", responseViewModel.manufacturingprocessdescription);

            Guid id = new Guid(responseViewModel.id);

            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            jsonString = await response.Content.ReadAsStringAsync();

            responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);
            Assert.Equal("Testing", responseViewModel.mainbusinessfocus);
            Assert.True(responseViewModel.applicant != null);
            Assert.Equal(currentAccount.id, responseViewModel.applicant.id);

            // Test upload, get, delete attachment
            string documentType = "Licence Application Main";


            using (var formData = new MultipartFormDataContent())
            {
                // Upload
                var fileContent = new ByteArrayContent(new byte[25 * 1024 * 1024]);
                fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name     = "file",
                    FileName = "test.pdf"
                };
                formData.Add(fileContent);
                formData.Add(new StringContent(documentType, Encoding.UTF8, "application/json"), "documentType");
                response = _client.PostAsync($"/api/file/{id}/attachments/incident", formData).Result;
                Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            }

            // Get
            request  = new HttpRequestMessage(HttpMethod.Get, $"/api/file/{id}/attachments/incident/{documentType}");
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            jsonString = await response.Content.ReadAsStringAsync();

            var files = JsonConvert.DeserializeObject <List <FileSystemItem> >(jsonString);

            files.ForEach(async file =>
            {
                // Delete
                request  = new HttpRequestMessage(HttpMethod.Delete, $"/api/file/{id}/attachments/incident?serverRelativeUrl={Uri.EscapeDataString(file.serverrelativeurl)}&documentType={documentType}");
                response = await _client.SendAsync(request);
                response.EnsureSuccessStatusCode();
            });

            request  = new HttpRequestMessage(HttpMethod.Get, $"/api/file/{id}/attachments/incident/{documentType}");
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            jsonString = await response.Content.ReadAsStringAsync();

            files = JsonConvert.DeserializeObject <List <FileSystemItem> >(jsonString);
            Assert.Empty(files);

            await LogoutAndCleanupTestUser(strId);
        }
        public async System.Threading.Tasks.Task TestUserCanAccessApplicationForTheirAccount()
        {
            string initialName = randomNewUserName("Application Shared ", 6);
            string service     = "Application";

            // login as default and get account for current user
            string loginUser1   = randomNewUserName("TestAppUser", 6);
            string loginAccount = randomNewUserName(loginUser1, 6);
            string loginUser2   = loginUser1 + "-2";

            loginUser1 = loginUser1 + "-1";
            var strId1 = await LoginAndRegisterAsNewUser(loginUser1, loginAccount);

            User user1 = await GetCurrentUser();

            Account currentAccount1 = await GetAccountForCurrentUser();

            // C - Create
            var request = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/Waiver");

            Application viewmodel_application = SecurityHelper.CreateNewApplication(currentAccount1);

            var jsonString = JsonConvert.SerializeObject(viewmodel_application);

            request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");

            var response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // parse as JSON.
            jsonString = await response.Content.ReadAsStringAsync();

            Application responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);

            // name should match.
            Assert.Equal("Testing", responseViewModel.mainbusinessfocus);
            Assert.Equal("Automated Testing", responseViewModel.manufacturingprocessdescription);

            Guid id = new Guid(responseViewModel.id);

            // R - Read
            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            jsonString = await response.Content.ReadAsStringAsync();

            responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);
            Assert.Equal(currentAccount1.id, responseViewModel.applicant.id);

            await Logout();

            // register and login as a second user
            var strId2 = await LoginAndRegisterAsNewUser(loginUser2, loginAccount);

            User user2 = await GetCurrentUser();

            Account currentAccount2 = await GetAccountForCurrentUser();

            // same account as user 1
            Assert.Equal(currentAccount2.id, currentAccount1.id);

            // R - Read (should be able to access by user)
            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // logout and cleanup (deletes the account and contact created above ^^^)
            await LogoutAndCleanupTestUser(strId2);

            // log back in as first user
            await Login(loginUser1);

            // R - Read - still has access to application
            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            jsonString = await response.Content.ReadAsStringAsync();

            responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);
            Assert.Equal(currentAccount1.id, responseViewModel.applicant.id);

            // D - Delete
            request  = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/" + id + "/delete");
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // should get a 404 if we try a get now.
            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);

            // logout and cleanup (deletes the account and contact created above ^^^)
            await LogoutAndCleanupTestUser(strId1);

            //await Logout();
        }
        public async System.Threading.Tasks.Task TestFileListing()
        {
            string initialName = randomNewUserName("First InitialName", 6);
            string changedName = randomNewUserName("First ChangedName", 6);
            string service     = "Application";

            // Login as default user

            var loginUser = randomNewUserName("NewLoginUser", 6);
            var strId     = await LoginAndRegisterAsNewUser(loginUser);

            User user = await GetCurrentUser();

            Account currentAccount = await GetAccountForCurrentUser();

            // C - Create
            var request = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/Waiver");

            Application viewmodel_application = SecurityHelper.CreateNewApplication(currentAccount);

            var jsonString = JsonConvert.SerializeObject(viewmodel_application);

            request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");

            var response = await _client.SendAsync(request);

            jsonString = await response.Content.ReadAsStringAsync();

            response.EnsureSuccessStatusCode();

            // parse as JSON.

            Application responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);

            //Assert.Equal("Applying Person", responseViewModel.applyingPerson);
            Assert.Equal("Testing", responseViewModel.mainbusinessfocus);
            Assert.Equal("Automated Testing", responseViewModel.manufacturingprocessdescription);

            Guid id = new Guid(responseViewModel.id);

            // Attach a file

            string testData = "This is just a test.";

            byte[] bytes        = Encoding.ASCII.GetBytes(testData);
            string documentType = "Test Document Type";
            // Create random filename
            var chars       = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
            var stringChars = new char[9];
            var random      = new Random();

            for (int i = 0; i < stringChars.Length; i++)
            {
                stringChars[i] = chars[random.Next(chars.Length)];
            }
            var    randomString = new String(stringChars);
            string filename     = randomString + ".txt";

            MultipartFormDataContent multiPartContent = new MultipartFormDataContent("----TestBoundary");
            var fileContent = new MultipartContent {
                new ByteArrayContent(bytes)
            };

            fileContent.Headers.ContentType                 = new MediaTypeHeaderValue("text/plain");
            fileContent.Headers.ContentDisposition          = new ContentDispositionHeaderValue("form-data");
            fileContent.Headers.ContentDisposition.Name     = "File";
            fileContent.Headers.ContentDisposition.FileName = filename;
            multiPartContent.Add(fileContent);
            multiPartContent.Add(new StringContent(documentType), "documentType");   // form input

            string accountId = user.accountid;

            // create a new request object for the upload, as we will be using multipart form submission.
            var requestMessage = new HttpRequestMessage(HttpMethod.Post, $"/api/file/{ id }/attachments/incident");

            requestMessage.Content = multiPartContent;

            var uploadResponse = await _client.SendAsync(requestMessage);

            uploadResponse.EnsureSuccessStatusCode();

            // Cleanup
            request  = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/" + id + "/delete");
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // should get a 404 if we try a get now.
            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);

            await LogoutAndCleanupTestUser(strId);
        }
        public async System.Threading.Tasks.Task TestCRUD()
        {
            string initialName = randomNewUserName("Application Initial Name ", 6);
            string changedName = randomNewUserName("Application Changed Name ", 6);
            string service     = "Application";

            // login as default and get account for current user
            var loginUser1 = randomNewUserName("TestAccountUser", 6);
            var strId      = await LoginAndRegisterAsNewUser(loginUser1);

            User user = await GetCurrentUser();

            Account currentAccount = await GetAccountForCurrentUser();

            // C - Create
            var request = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/Waiver");

            Application viewmodel_application = SecurityHelper.CreateNewApplication(currentAccount);

            var jsonString = JsonConvert.SerializeObject(viewmodel_application);

            request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");

            var response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // parse as JSON.
            jsonString = await response.Content.ReadAsStringAsync();

            Application responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);

            Assert.Equal("Testing", responseViewModel.mainbusinessfocus);
            Assert.Equal("Automated Testing", responseViewModel.manufacturingprocessdescription);


            Guid id = new Guid(responseViewModel.id);

            //return;
            // R - Read
            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            jsonString = await response.Content.ReadAsStringAsync();

            responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);

            Assert.Equal("Testing", responseViewModel.mainbusinessfocus);
            Assert.Equal("Automated Testing", responseViewModel.manufacturingprocessdescription);


            Assert.True(responseViewModel.applicant != null);
            Assert.Equal(currentAccount.id, responseViewModel.applicant.id);


            // U - Update
            viewmodel_application = new Application();
            viewmodel_application.mainbusinessfocus = changedName;


            request = new HttpRequestMessage(HttpMethod.Put, "/api/" + service + "/" + id)
            {
                Content = new StringContent(JsonConvert.SerializeObject(viewmodel_application), Encoding.UTF8, "application/json")
            };
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // verify that the update persisted.

            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            jsonString = await response.Content.ReadAsStringAsync();

            responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);
            Assert.Equal(changedName, responseViewModel.mainbusinessfocus);

            // D - Delete

            request  = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/" + id + "/delete");
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // second delete should return a 404.
            request  = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/" + id + "/delete");
            response = await _client.SendAsync(request);

            Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);

            // should get a 404 if we try a get now.
            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);

            // logout and cleanup (deletes the account and contact created above ^^^)
            await LogoutAndCleanupTestUser(strId);
        }
        public async System.Threading.Tasks.Task TestDashboard()
        {
            string initialName = randomNewUserName("Application Initial Name ", 6);
            string changedName = randomNewUserName("Application Changed Name ", 6);
            string service     = "Application";

            // login as default and get account for current user
            var loginUser1 = randomNewUserName("TestAccountUser", 6);
            var strId      = await LoginAndRegisterAsNewUser(loginUser1);

            User user = await GetCurrentUser();

            Account currentAccount = await GetAccountForCurrentUser();

            // C - Create
            var request = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/Waiver");

            Application viewmodel_application = SecurityHelper.CreateNewApplication(currentAccount);

            var jsonString = JsonConvert.SerializeObject(viewmodel_application);

            request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");

            var response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // parse as JSON.
            jsonString = await response.Content.ReadAsStringAsync();

            Application responseViewModel = JsonConvert.DeserializeObject <Application>(jsonString);

            Assert.Equal("Testing", responseViewModel.mainbusinessfocus);
            Assert.Equal("Automated Testing", responseViewModel.manufacturingprocessdescription);

            Guid id = new Guid(responseViewModel.id);

            // verify that item is now available on the dashboard.
            request         = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/current");
            request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");

            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // parse as JSON.
            jsonString = await response.Content.ReadAsStringAsync();

            List <Application> dashboardItems = JsonConvert.DeserializeObject <List <Application> >(jsonString);

            bool found = false;

            // verify that the item was present
            foreach (var item in dashboardItems)
            {
                if (item.id == responseViewModel.id)
                {
                    found = true;
                }
            }

            Assert.True(found);

            // D - Delete

            request  = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/" + id + "/delete");
            response = await _client.SendAsync(request);

            response.EnsureSuccessStatusCode();

            // second delete should return a 404.
            request  = new HttpRequestMessage(HttpMethod.Post, "/api/" + service + "/" + id + "/delete");
            response = await _client.SendAsync(request);

            Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);

            // should get a 404 if we try a get now.
            request  = new HttpRequestMessage(HttpMethod.Get, "/api/" + service + "/" + id);
            response = await _client.SendAsync(request);

            Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);

            // logout and cleanup (deletes the account and contact created above ^^^)
            await LogoutAndCleanupTestUser(strId);
        }