diff --git a/shared-helpers/src/types/backend-swagger.ts b/shared-helpers/src/types/backend-swagger.ts index e3b5ca0ffe7..72390b1da4e 100644 --- a/shared-helpers/src/types/backend-swagger.ts +++ b/shared-helpers/src/types/backend-swagger.ts @@ -3420,7 +3420,7 @@ export interface ListingFilterParams { availability?: FilterAvailabilityEnum /** */ - bathrooms?: number + bathrooms?: [] /** */ bedrooms?: number diff --git a/sites/partners/load-testing/headless-listing-save.js b/sites/partners/load-testing/headless-listing-save.js new file mode 100644 index 00000000000..1c81558d372 --- /dev/null +++ b/sites/partners/load-testing/headless-listing-save.js @@ -0,0 +1,72 @@ +/* eslint-disable import/no-unresolved */ +import { group, check } from "k6" +import http from "k6/http" + +export const options = { + vus: 1, + iterations: 1, +} + +export default function () { + let params + let resp + let url + let userCookies + + group("Default group", function () { + params = { + headers: { + language: `en`, + appurl: `https://partners.core-dev.bloomhousing.dev`, + accept: `application/json, text/plain, */*`, + "content-type": `application/json`, + referer: `https://partners.core-dev.bloomhousing.dev/sign-in`, + }, + cookies: {}, + } + + url = http.url`https://partners.core-dev.bloomhousing.dev/api/adapter/auth/login` + resp = http.request("POST", url, `{"email":"admin@example.com","password":"abcdef"}`, params) + + check(resp, { "sign in": (r) => r.status === 201 }) + userCookies = resp.cookies + // eslint-disable-next-line no-undef + console.log("33:", userCookies) + + params = { + headers: { + language: `en`, + appurl: `https://partners.core-dev.bloomhousing.dev`, + accept: `application/json, text/plain, */*`, + referer: `https://partners.core-dev.bloomhousing.dev/sign-in`, + }, + cookies: {}, + } + + url = http.url`https://partners.core-dev.bloomhousing.dev/api/adapter/user` + resp = http.request("GET", url, null, params) + + check(resp, { "get user": (r) => r.status === 200 }) + + params = { + headers: { + language: `en`, + appurl: `https://partners.core-dev.bloomhousing.dev`, + accept: `application/json, text/plain, */*`, + "content-type": `application/json`, + referer: `https://partners.core-dev.bloomhousing.dev/listings/5fdfd253-d270-48e4-92ee-793ec5beda78/edit`, + }, + cookies: {}, + } + + url = http.url`https://partners.core-dev.bloomhousing.dev/api/adapter/listings/5fdfd253-d270-48e4-92ee-793ec5beda78` + resp = http.request( + "PUT", + url, + `{"id":"d8842fca-6830-486f-80cc-85296a41847c","assets":[],"createdAt":"2026-06-01T06:15:26.738Z","updatedAt":"2026-06-01T06:50:23.921Z","additionalApplicationSubmissionNotes":null,"digitalApplication":true,"commonDigitalApplication":true,"paperApplication":false,"referralOpportunity":false,"accessibility":null,"amenities":null,"buildingTotalUnits":0,"developer":"Cielo Housing","listingFileNumber":null,"householdSizeMax":0,"householdSizeMin":0,"neighborhood":"North End","region":"Eastside","configurableRegion":null,"petPolicy":null,"allowsDogs":null,"allowsCats":null,"smokingPolicy":null,"unitsAvailable":1,"unitAmenities":null,"servicesOffered":null,"yearBuilt":1900,"applicationDueDate":"2026-07-01T06:15:00.000Z","applicationOpenDate":"2026-05-31T06:15:25.104Z","applicationFee":"60","creditScreeningFee":null,"applicationOrganization":null,"applicationPickUpAddressOfficeHours":null,"applicationPickUpAddressType":null,"applicationDropOffAddressOfficeHours":null,"applicationDropOffAddressType":null,"applicationMailingAddressType":null,"buildingSelectionCriteria":null,"marketingFlyer":null,"accessibleMarketingFlyer":null,"cocInfo":null,"costsNotIncluded":null,"creditHistory":null,"criminalBackground":null,"depositMin":"0","depositMax":"50","depositType":null,"depositHelperText":"Deposit will not exceed one month's rent","disableUnitsAccordion":false,"hasHudEbllClearance":null,"leasingAgentEmail":"joe@smithrealty.com","leasingAgentName":"Joe Smith","leasingAgentOfficeHours":"9:00am - 5:00pm, Monday-Friday","leasingAgentPhone":"(773) 580-5897","leasingAgentTitle":"Senior Leasing Agent","managementWebsite":null,"name":"test notification listing","parkingFee":null,"parkType":null,"postmarkedApplicationsReceivedByDate":"2025-06-06T23:00:00.000Z","programRules":null,"rentalAssistance":"Housing Choice Vouchers, Section 8 and other valid rental assistance programs will be considered for this property. ","rentalHistory":null,"requiredDocuments":null,"requiredDocumentsList":null,"specialNotes":null,"waitlistCurrentSize":null,"waitlistMaxSize":null,"whatToExpect":"

Applicants will be contacted by the property agent in rank order until vacancies are filled. All of the information that you have provided will be verified and your eligibility confirmed. Your application will be removed from the waitlist if you have made any fraudulent statements. If we cannot verify a housing preference that you have claimed, you will not receive the preference but will not be otherwise penalized. Should your application be chosen, be prepared to fill out a more detailed application and provide required supporting documents.

","whatToExpectAdditionalText":null,"status":"active","reviewOrderType":"firstComeFirstServe","displayWaitlistSize":false,"reservedCommunityDescription":"Seniors over 55 are eligible for this property ","reservedCommunityMinAge":null,"resultLink":null,"isWaitlistOpen":false,"waitlistOpenSpots":null,"customMapPin":false,"contentUpdatedAt":"2026-06-01T06:38:31.303Z","publishedAt":"2026-06-01T06:19:08.419Z","scheduledPublishAt":null,"closedAt":null,"afsLastRunAt":"1970-01-01T00:00:00.000Z","lotteryLastPublishedAt":null,"lotteryLastRunAt":null,"lotteryStatus":null,"lastApplicationUpdateAt":"2026-06-01T06:50:23.919Z","listingMultiselectQuestions":[],"applicationMethods":[{"createdAt":"2026-06-01T06:38:31.306Z","updatedAt":"2026-06-01T06:38:31.306Z","id":"6eda6877-1d17-4451-8281-b3efadd00165","type":"Internal","label":null,"externalReference":null,"acceptsPostmarkedApplications":null,"phoneNumber":null,"paperApplications":[]}],"listingEvents":[],"listingsBuildingAddress":{"id":"a3f24b64-8e54-4a2d-aa3a-5026d3dee83e","placeName":"Yellowstone National Park","city":"Yellowstone National Park","county":"Teton","state":"WY","street":"3200 Old Faithful Inn Rd","zipCode":"82190","latitude":44.45995,"longitude":-110.831197},"listingsApplicationPickUpAddress":{"placeName":"Yosemite National Park","city":"Yosemite Valley","county":"Mariposa","state":"CA","street":"9035 Village Dr","zipCode":"95389","latitude":37.7487501,"longitude":-119.5920354},"listingsApplicationDropOffAddress":{"placeName":"Yosemite National Park","city":"Yosemite Valley","county":"Mariposa","state":"CA","street":"9035 Village Dr","zipCode":"95389","latitude":37.7487501,"longitude":-119.5920354},"listingsApplicationMailingAddress":{"placeName":"Rocky Mountain National Park","city":"Estes Park","county":"Larimer","state":"CO","street":"1000 US-36","zipCode":"80517","latitude":40.3800984,"longitude":-105.5709864},"listingsLeasingAgentAddress":{"id":"fb4715f2-224a-454b-8717-914d37097568","placeName":"Rocky Mountain National Park","city":"Estes Park","county":"Larimer","state":"CO","street":"1000 US-36","zipCode":"80517","latitude":40.3800984,"longitude":-105.5709864},"listingsMarketingFlyerFile":null,"listingsAccessibleMarketingFlyerFile":null,"jurisdictions":{"id":"3f0dbbe8-a84d-4158-bfc8-fd8e378d68dc","name":"Bloomington"},"listingsResult":null,"reservedCommunityTypes":null,"listingImages":[{"ordinal":0,"assets":{"createdAt":"2026-06-01T06:15:26.741Z","updatedAt":"2026-06-01T06:15:26.741Z","id":"ee118a51-3e74-40e8-bf35-9ed613ff62b2","fileId":"https://res.cloudinary.com/exygy/image/upload/w_1302,c_limit,q_65/dev/trayan-xIOYJSVEZ8c-unsplash_f1axsg.jpg","label":"cloudinaryBuilding"},"description":""}],"listingFeatures":{"accessibleHeightToilet":false,"accessibleParking":false,"acInUnit":false,"barrierFreeBathroom":false,"barrierFreeEntrance":false,"barrierFreePropertyEntrance":false,"barrierFreeUnitEntrance":true,"bathGrabBarsOrReinforcements":false,"bathroomCounterLowered":false,"brailleSignageInBuilding":false,"carbonMonoxideDetectorWithStrobe":false,"carpetInUnit":false,"elevator":true,"extraAudibleCarbonMonoxideDetector":false,"extraAudibleSmokeDetector":false,"fireSuppressionSprinklerSystem":false,"frontControlsDishwasher":false,"frontControlsStoveCookTop":false,"grabBars":true,"hardFlooringInUnit":false,"hearing":true,"hearingAndVision":false,"heatingInUnit":true,"inUnitWasherDryer":false,"kitchenCounterLowered":false,"laundryInBuilding":true,"leverHandlesOnDoors":false,"leverHandlesOnFaucets":false,"loweredCabinets":false,"loweredLightSwitch":false,"mobility":true,"noEntryStairs":false,"nonDigitalKitchenAppliances":false,"noStairsToParkingSpots":false,"noStairsWithinUnit":false,"parkingOnSite":true,"refrigeratorWithBottomDoorFreezer":false,"rollInShower":true,"serviceAnimalsAllowed":false,"smokeDetectorWithStrobe":false,"streetLevelEntrance":false,"toiletGrabBarsOrReinforcements":false,"ttyAmplifiedPhone":false,"turningCircleInBathrooms":false,"visual":false,"walkInShower":false,"wheelchairRamp":false,"wideDoorways":true},"listingUtilities":{"water":true,"gas":true,"trash":false,"sewer":true,"electricity":false,"cable":false,"phone":true,"internet":false},"units":[{"id":"4c129a57-c4d6-4d60-8cf6-83294f72d22b","amiChart":{"createdAt":"2026-06-01T06:15:26.383Z","updatedAt":"2026-06-01T06:15:26.383Z","id":"5e8aa82a-9ccb-4652-866b-0e5dabbc6001","name":"Noble Skyline - Bloomington"},"amiPercentage":"30","annualIncomeMin":null,"monthlyIncomeMin":"2000","floor":1,"annualIncomeMax":null,"maxOccupancy":3,"minOccupancy":1,"monthlyRent":"1200","numBathrooms":1,"numBedrooms":1,"number":"101","sqFeet":"750","monthlyRentAsPercentOfIncome":null,"bmrProgramChart":null,"unitTypes":{"createdAt":"2026-06-01T06:15:26.266Z","updatedAt":"2026-06-01T06:15:26.266Z","id":"d18d6ef2-4bea-462f-a10c-3a7c4135054d","name":"oneBdrm","numBedrooms":1},"unitRentTypes":null,"accessibilityPriorityType":null,"unitAmiChartOverrides":null}],"unitGroups":[],"unitsSummarized":{"unitTypes":[{"createdAt":"2026-06-01T06:15:26.266Z","updatedAt":"2026-06-01T06:15:26.266Z","id":"d18d6ef2-4bea-462f-a10c-3a7c4135054d","name":"oneBdrm","numBedrooms":1}],"priorityTypes":[],"amiPercentages":["30"],"byUnitTypeAndRent":[{"areaRange":{"min":750,"max":750},"minIncomeRange":{"min":"$2,000","max":"$2,000"},"occupancyRange":{"min":1,"max":3},"rentRange":{"min":"$1,200","max":"$1,200"},"rentAsPercentIncomeRange":{"min":null,"max":null},"floorRange":{"min":1,"max":1},"unitTypes":{"createdAt":"2026-06-01T06:15:26.266Z","updatedAt":"2026-06-01T06:15:26.266Z","id":"d18d6ef2-4bea-462f-a10c-3a7c4135054d","name":"oneBdrm","numBedrooms":1},"totalAvailable":1}],"byUnitType":[{"areaRange":{"min":750,"max":750},"minIncomeRange":{"min":"$2,000","max":"$2,000"},"occupancyRange":{"min":1,"max":3},"rentRange":{"min":"$1,200","max":"$1,200"},"rentAsPercentIncomeRange":{"min":null,"max":null},"floorRange":{"min":1,"max":1},"unitTypes":{"createdAt":"2026-06-01T06:15:26.266Z","updatedAt":"2026-06-01T06:15:26.266Z","id":"d18d6ef2-4bea-462f-a10c-3a7c4135054d","name":"oneBdrm","numBedrooms":1},"totalAvailable":0}],"byAMI":[{"percent":"30","byUnitType":[{"areaRange":{"min":750,"max":750},"minIncomeRange":{"min":"$2,000","max":"$2,000"},"occupancyRange":{"min":1,"max":3},"rentRange":{"min":"$1,200","max":"$1,200"},"rentAsPercentIncomeRange":{"min":null,"max":null},"floorRange":{"min":1,"max":1},"unitTypes":{"createdAt":"2026-06-01T06:15:26.266Z","updatedAt":"2026-06-01T06:15:26.266Z","id":"d18d6ef2-4bea-462f-a10c-3a7c4135054d","name":"oneBdrm","numBedrooms":1},"totalAvailable":1}]}],"hmi":{"columns":{"sizeColumn":"listings.householdSize","maxIncomeMonth":"listings.maxIncomeMonth","maxIncomeYear":"listings.maxIncomeYear"},"rows":[{"sizeColumn":1,"maxIncomeMonth":"listings.monthlyIncome*income:$3,000.00","maxIncomeYear":"listings.annualIncome*income:$36,000"},{"sizeColumn":2,"maxIncomeMonth":"listings.monthlyIncome*income:$4,000.00","maxIncomeYear":"listings.annualIncome*income:$48,000"},{"sizeColumn":3,"maxIncomeMonth":"listings.monthlyIncome*income:$5,000.00","maxIncomeYear":"listings.annualIncome*income:$60,000"}]}},"urlSlug":"blue_sky_apartments_3200_old_faithful_inn_rd_yellowstone_national_park_wy","requestedChanges":null,"requestedChangesDate":"1970-01-01T07:00:00.000Z","lotteryOptIn":null,"includeCommunityDisclaimer":null,"communityDisclaimerTitle":null,"communityDisclaimerDescription":null,"marketingType":"marketing","marketingYear":null,"marketingSeason":null,"marketingMonth":null,"homeType":"apartment","isVerified":false,"section8Acceptance":false,"listingNeighborhoodAmenities":null,"lastUpdatedByUser":{"id":"2d272706-6d90-4457-839b-98fe00a0b464","name":"First Last"},"property":null,"showWaitlist":false,"configurableAccessibilityFeatures":["configurableAccessibilityFeatures.barrierFreeUnitEntrance","configurableAccessibilityFeatures.elevator","configurableAccessibilityFeatures.grabBars","configurableAccessibilityFeatures.hearing","configurableAccessibilityFeatures.heatingInUnit","configurableAccessibilityFeatures.laundryInBuilding","configurableAccessibilityFeatures.mobility","configurableAccessibilityFeatures.parkingOnSite","configurableAccessibilityFeatures.rollInShower","configurableAccessibilityFeatures.wideDoorways"],"mapPinPosition":"automatic","includeCommunityDisclaimerQuestion":null,"listingAvailabilityQuestion":"availableUnits","listingSection8Acceptance":"no","utilities":["water","gas","sewer","phone"],"reviewOrderQuestion":"reviewOrderFCFS","waitlistOpenQuestion":"no","digitalApplicationChoice":"yes","paperApplicationChoice":"no","referralOpportunityChoice":"no","canApplicationsBeMailedIn":"yes","canPaperApplicationsBePickedUp":"yes","canApplicationsBeDroppedOff":"yes","whereApplicationsMailedIn":"anotherAddress","whereApplicationsPickedUp":"anotherAddress","whereApplicationsDroppedOff":"anotherAddress","arePostmarksConsidered":"yes","postmarkByDateDateField":{"month":"06","day":"06","year":"2025"},"postmarkByDateTimeField":{"hours":"04","minutes":"00","period":"pm"},"applicationDueDateField":{"month":"06","day":"30","year":"2026"},"applicationDueTimeField":{"hours":"11","minutes":"15","period":"pm"},"commonDigitalApplicationChoice":"yes"}`, + params + ) + + check(resp, { "update listing": (r) => r.status === 200 }) + }) +} diff --git a/sites/public/load-testing/headless.js b/sites/public/load-testing/headless.js new file mode 100644 index 00000000000..f4b8dd321b3 --- /dev/null +++ b/sites/public/load-testing/headless.js @@ -0,0 +1,368 @@ +/* eslint-disable import/no-unresolved */ +import { group, sleep, check } from "k6" +import http from "k6/http" +import sql from "k6/x/sql" +import driver from "k6/x/sql/driver/postgres" + +/** + * Run this with the following command `k6 run headless.js --env DB_URL=""` + * adding vus increases the number of workers + * adding iterations increases the max number of runs the default funciton will perform + * in AWS environments we'll need to run this is the EC2 instance so that we can hit the db since its protected behind the VPC + */ + +export const options = { + vus: 5, + iterations: 10, +} + +const randomString = (stringLength = 5) => + (Math.random() + 1).toString(36).substring(2, stringLength + 2) + +let db + +export function setup() { + // eslint-disable-next-line no-undef + db = sql.open(driver, __ENV.DB_URL) +} + +export function teardown() { + db.close() +} + +export default function () { + let params + let resp + let url + + group("Default group", function () { + const email = `${randomString()}+${randomString()}@exygy.com` + const password = `Abcdef123456!${randomString()}` + + // Hit base URL + params = { + headers: { + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + "sec-ch-ua-mobile": `?0`, + "sec-ch-ua-platform": `"macOS"`, + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-fetch-dest": `document`, + "sec-fetch-mode": `navigate`, + "sec-fetch-site": `none`, + "sec-fetch-user": `?1`, + "upgrade-insecure-requests": `1`, + accept: `text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7`, + priority: `u=0, i`, + }, + cookies: {}, + } + url = http.url`https://core-dev.bloomhousing.dev/` + resp = http.request("GET", url, null, params) + check(resp, { "status equals 200": (r) => r.status === 200 }) + + // create a user + params = { + headers: { + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + "content-type": `application/json`, + "sec-ch-ua-mobile": `?0`, + "sec-ch-ua-platform": `"macOS"`, + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-fetch-dest": `empty`, + "sec-fetch-mode": `cors`, + "sec-fetch-site": `same-origin`, + accept: `application/json, text/plain, */*`, + appurl: `https://core-dev.bloomhousing.dev`, + jurisdictionname: `Bloomington`, + language: `en`, + origin: `https://core-dev.bloomhousing.dev`, + priority: `u=1, i`, + referer: `https://core-dev.bloomhousing.dev/create-account`, + }, + cookies: {}, + } + url = http.url`https://core-dev.bloomhousing.dev/api/adapter/user/public` + resp = http.request( + "POST", + url, + `{"firstName":"${randomString()}","middleName":"","lastName":"${randomString()}","email":"${email}","password":"${password}","passwordConfirmation":"${password}","dob":"1955-01-11T08:00:00.000Z","language":"en","appUrl":"https://core-dev.bloomhousing.dev"}`, + params + ) + check(resp, { "status equals 201": (r) => r.status === 201 }) + + const userToConfirm = db.query( + db, + `SELECT id, confirmation_token FROM user_accounts WHERE email = '${email}';` + ) + const confirmationToken = userToConfirm[0].confirmation_token + + // hit confirm user page + params = { + headers: { + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + "sec-ch-ua-mobile": `?0`, + "sec-ch-ua-platform": `"macOS"`, + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-fetch-dest": `document`, + "sec-fetch-mode": `navigate`, + "sec-fetch-site": `none`, + "sec-fetch-user": `?1`, + "upgrade-insecure-requests": `1`, + accept: `text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7`, + priority: `u=0, i`, + }, + cookies: {}, + } + url = http.url`https://core-dev.bloomhousing.dev/?token=${confirmationToken}` + resp = http.request("GET", url, null, params) + check(resp, { "status equals 200": (r) => r.status === 200 }) + + // confirm user + params = { + headers: { + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + "content-type": `application/json`, + "sec-ch-ua-mobile": `?0`, + "sec-ch-ua-platform": `"macOS"`, + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-fetch-dest": `empty`, + "sec-fetch-mode": `cors`, + "sec-fetch-site": `same-origin`, + accept: `application/json, text/plain, */*`, + appurl: `https://core-dev.bloomhousing.dev`, + jurisdictionname: `Bloomington`, + language: `en`, + origin: `https://core-dev.bloomhousing.dev`, + priority: `u=1, i`, + referer: `https://core-dev.bloomhousing.dev/?token=${confirmationToken}`, + }, + cookies: {}, + } + url = http.url`https://core-dev.bloomhousing.dev/api/adapter/auth/confirm` + resp = http.request("PUT", url, `{"token":"${confirmationToken}"}`, params) + check(resp, { "status equals 201": (r) => r.status === 201 }) + + // sign in + params = { + headers: { + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + "content-type": `application/json`, + "sec-ch-ua-mobile": `?0`, + "sec-ch-ua-platform": `"macOS"`, + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-fetch-dest": `empty`, + "sec-fetch-mode": `cors`, + "sec-fetch-site": `same-origin`, + accept: `application/json, text/plain, */*`, + appurl: `https://core-dev.bloomhousing.dev`, + jurisdictionname: `Bloomington`, + language: `en`, + origin: `https://core-dev.bloomhousing.dev`, + priority: `u=1, i`, + referer: `https://core-dev.bloomhousing.dev/sign-in`, + }, + cookies: {}, + } + url = http.url`https://core-dev.bloomhousing.dev/api/adapter/auth/login` + resp = http.request("POST", url, `{"email":"${email}","password":"${password}"}`, params) + check(resp, { "status equals 201": (r) => r.status === 201 }) + + const vuJar = http.cookieJar() + const cookiesForURL = vuJar.cookiesForURL("https://core-dev.bloomhousing.dev") + check(null, { + "has cookie 'access-token'": () => cookiesForURL["access-token"].length > 0, + "has cookie 'refresh-token'": () => cookiesForURL["refresh-token"].length > 0, + "has cookie 'access-token-available'": () => + cookiesForURL["access-token-available"].length > 0, + }) + + // get user profile + params = { + headers: { + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + "sec-ch-ua-mobile": `?0`, + "sec-ch-ua-platform": `"macOS"`, + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-fetch-dest": `empty`, + "sec-fetch-mode": `cors`, + "sec-fetch-site": `same-origin`, + accept: `application/json, text/plain, */*`, + appurl: `https://core-dev.bloomhousing.dev`, + jurisdictionname: `Bloomington`, + language: `en`, + priority: `u=1, i`, + referer: `https://core-dev.bloomhousing.dev/sign-in`, + }, + cookies: { + ["access-token"]: cookiesForURL["access-token"], + ["refresh-token"]: cookiesForURL["refresh-token"], + ["access-token-available"]: cookiesForURL["access-token-available"], + }, + } + url = http.url`https://core-dev.bloomhousing.dev/api/adapter/user` + resp = http.request("GET", url, null, params) + check(resp, { "status equals 200": (r) => r.status === 200 }) + + // Get Jurisdiction + params = { + headers: { + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + "sec-ch-ua-mobile": `?0`, + "sec-ch-ua-platform": `"macOS"`, + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-fetch-dest": `empty`, + "sec-fetch-mode": `cors`, + "sec-fetch-site": `same-origin`, + accept: `application/json, text/plain, */*`, + appurl: `https://core-dev.bloomhousing.dev`, + jurisdictionname: `Bloomington`, + language: `en`, + priority: `u=1, i`, + referer: `https://core-dev.bloomhousing.dev/applications/start/choose-language?listingId=496cd10a-4f3d-4add-9a79-c10ab7cd72b2`, + }, + cookies: { + ["access-token"]: cookiesForURL["access-token"], + ["refresh-token"]: cookiesForURL["refresh-token"], + ["access-token-available"]: cookiesForURL["access-token-available"], + }, + } + url = http.url`https://core-dev.bloomhousing.dev/api/adapter/jurisdictions/38f7eb8c-e29c-447e-9b01-eb1c78f5457c` + resp = http.request("GET", url, null, params) + check(resp, { "status equals 200": (r) => r.status === 200 }) + + // Look at a listing + params = { + headers: { + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + "if-none-match": `"89n9pbkw5fd51"`, + "sec-ch-ua-mobile": `?0`, + "sec-ch-ua-platform": `"macOS"`, + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-fetch-dest": `empty`, + "sec-fetch-mode": `cors`, + "sec-fetch-site": `same-origin`, + accept: `application/json, text/plain, */*`, + appurl: `https://core-dev.bloomhousing.dev`, + jurisdictionname: `Bloomington`, + language: `en`, + priority: `u=1, i`, + referer: `https://core-dev.bloomhousing.dev/applications/start/choose-language?listingId=496cd10a-4f3d-4add-9a79-c10ab7cd72b2`, + }, + cookies: { + ["access-token"]: cookiesForURL["access-token"], + ["refresh-token"]: cookiesForURL["refresh-token"], + ["access-token-available"]: cookiesForURL["access-token-available"], + }, + } + url = http.url`https://core-dev.bloomhousing.dev/api/adapter/listings/496cd10a-4f3d-4add-9a79-c10ab7cd72b2` + resp = http.request("GET", url, null, params) + check(resp, { "status equals 200": (r) => r.status === 200 }) + + // jurisdiction fetch + params = { + headers: { + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + "sec-ch-ua-mobile": `?0`, + "sec-ch-ua-platform": `"macOS"`, + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-fetch-dest": `empty`, + "sec-fetch-mode": `cors`, + "sec-fetch-site": `same-origin`, + accept: `application/json, text/plain, */*`, + appurl: `https://core-dev.bloomhousing.dev`, + jurisdictionname: `Bloomington`, + language: `en`, + priority: `u=1, i`, + referer: `https://core-dev.bloomhousing.dev/applications/start/choose-language?listingId=496cd10a-4f3d-4add-9a79-c10ab7cd72b2`, + }, + cookies: { + ["access-token"]: cookiesForURL["access-token"], + ["refresh-token"]: cookiesForURL["refresh-token"], + ["access-token-available"]: cookiesForURL["access-token-available"], + }, + } + url = http.url`https://core-dev.bloomhousing.dev/api/adapter/jurisdictions/38f7eb8c-e29c-447e-9b01-eb1c78f5457c` + resp = http.request("GET", url, null, params) + check(resp, { "status equals 200": (r) => r.status === 200 }) + + // verify application submission + params = { + headers: { + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + "content-type": `application/json`, + "sec-ch-ua-mobile": `?0`, + "sec-ch-ua-platform": `"macOS"`, + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-fetch-dest": `empty`, + "sec-fetch-mode": `cors`, + "sec-fetch-site": `same-origin`, + accept: `application/json, text/plain, */*`, + appurl: `https://core-dev.bloomhousing.dev`, + jurisdictionname: `Bloomington`, + language: `en`, + origin: `https://core-dev.bloomhousing.dev`, + priority: `u=1, i`, + referer: `https://core-dev.bloomhousing.dev/applications/review/summary`, + }, + cookies: { + ["access-token"]: cookiesForURL["access-token"], + ["refresh-token"]: cookiesForURL["refresh-token"], + ["access-token-available"]: cookiesForURL["access-token-available"], + }, + } + url = http.url`https://core-dev.bloomhousing.dev/api/adapter/applications/verify` + resp = http.request( + "POST", + url, + `{"loaded":false,"autofilled":false,"completedSections":3,"submissionType":"electronical","language":"en","acceptedTerms":false,"status":"submitted","accessibleUnitWaitlistNumber":null,"conventionalUnitWaitlistNumber":null,"manualLotteryPositionNumber":null,"applicant":{"phoneNumberType":"home","noPhone":false,"applicantAddress":{"street":"Eastborne Avenue","street2":"1/2","city":"Los Angeles","state":"AZ","zipCode":"90024","county":"","longitude":-118.426842,"latitude":34.056933},"workInRegion":"no","phoneNumber":"(520) 123-4567","firstName":"First Name","middleName":"Middle Name","lastName":"Last Name","birthMonth":"1","birthDay":"1","birthYear":"2000","emailAddress":"${email}","noEmail":false,"fullTimeStudent":null,"applicantWorkAddress":{"street":"","street2":"","city":"","state":"","zipCode":"","county":""}},"additionalPhone":false,"additionalPhoneNumber":"","additionalPhoneNumberType":"","contactPreferences":["letter"],"householdSize":1,"housingStatus":"","sendMailToMailingAddress":false,"applicationsMailingAddress":{"street":"","street2":"","city":"","state":"","zipCode":""},"applicationsAlternateAddress":{"street":"","street2":"","city":"","state":"","zipCode":""},"alternateContact":{"type":"noContact","firstName":"","lastName":"","agency":"","phoneNumber":"","emailAddress":null,"address":{"street":"","street2":"","city":"","state":"","zipCode":""}},"accessibility":{"mobility":false,"vision":false,"hearing":false,"other":null},"householdExpectingChanges":false,"householdStudent":false,"incomeVouchers":true,"income":"5000.00","incomePeriod":"perMonth","householdMember":[],"preferredUnitTypes":[{"id":"cb6dad5c-88af-4afe-af72-4eb4a0318ef7"}],"demographics":{"ethnicity":"notHispanicLatino","gender":"","sexualOrientation":"","howDidYouHear":["friend"],"race":["asian","asian-asianIndian"],"spokenLanguage":""},"preferences":[],"programs":[],"confirmationCode":"","id":"","reachedReviewStep":true,"reviewStatus":"pending","listing":{"id":"496cd10a-4f3d-4add-9a79-c10ab7cd72b2"},"appUrl":"https://core-dev.bloomhousing.dev"}`, + params + ) + check(resp, { "status equals 201": (r) => r.status === 201 }) + + // submit application + params = { + headers: { + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + "content-type": `application/json`, + "sec-ch-ua-mobile": `?0`, + "sec-ch-ua-platform": `"macOS"`, + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-fetch-dest": `empty`, + "sec-fetch-mode": `cors`, + "sec-fetch-site": `same-origin`, + accept: `application/json, text/plain, */*`, + appurl: `https://core-dev.bloomhousing.dev`, + jurisdictionname: `Bloomington`, + language: `en`, + origin: `https://core-dev.bloomhousing.dev`, + priority: `u=1, i`, + referer: `https://core-dev.bloomhousing.dev/applications/review/terms`, + }, + cookies: { + ["access-token"]: cookiesForURL["access-token"], + ["refresh-token"]: cookiesForURL["refresh-token"], + ["access-token-available"]: cookiesForURL["access-token-available"], + }, + } + url = http.url`https://core-dev.bloomhousing.dev/api/adapter/applications/submit` + resp = http.request( + "POST", + url, + `{"loaded":false,"autofilled":false,"completedSections":6,"submissionType":"electronical","language":"en","acceptedTerms":true,"status":"submitted","accessibleUnitWaitlistNumber":null,"conventionalUnitWaitlistNumber":null,"manualLotteryPositionNumber":null,"applicant":{"phoneNumberType":"home","noPhone":false,"applicantAddress":{"street":"Eastborne Avenue","street2":"1/2","city":"Los Angeles","state":"AZ","zipCode":"90024","county":"","longitude":-118.426842,"latitude":34.056933},"workInRegion":"no","phoneNumber":"(520) 123-4567","firstName":"${randomString()}}","middleName":"${randomString()}}","lastName":"${randomString()}}","birthMonth":"1","birthDay":"1","birthYear":"2000","emailAddress":"${email}","noEmail":false,"fullTimeStudent":null,"applicantWorkAddress":{"street":"","street2":"","city":"","state":"","zipCode":"","county":""}},"additionalPhone":false,"additionalPhoneNumber":"","additionalPhoneNumberType":"","contactPreferences":["letter"],"householdSize":1,"housingStatus":"","sendMailToMailingAddress":false,"applicationsMailingAddress":{"street":"","street2":"","city":"","state":"","zipCode":""},"applicationsAlternateAddress":{"street":"","street2":"","city":"","state":"","zipCode":""},"alternateContact":{"type":"noContact","firstName":"","lastName":"","agency":"","phoneNumber":"","emailAddress":null,"address":{"street":"","street2":"","city":"","state":"","zipCode":""}},"accessibility":{"mobility":false,"vision":false,"hearing":false,"other":null},"householdExpectingChanges":false,"householdStudent":false,"incomeVouchers":true,"income":"5000.00","incomePeriod":"perMonth","householdMember":[],"preferredUnitTypes":[{"id":"cb6dad5c-88af-4afe-af72-4eb4a0318ef7"}],"demographics":{"ethnicity":"notHispanicLatino","gender":"","sexualOrientation":"","howDidYouHear":["friend"],"race":["asian","asian-asianIndian"],"spokenLanguage":""},"preferences":[],"programs":[],"confirmationCode":"","id":"","reachedReviewStep":true,"reviewStatus":"pending","listings":{"id":"496cd10a-4f3d-4add-9a79-c10ab7cd72b2"},"appUrl":"https://core-dev.bloomhousing.dev"}`, + params + ) + check(resp, { "status equals 201": (r) => r.status === 201 }) + }) + sleep(1) +} diff --git a/sites/public/load-testing/initial-test.js b/sites/public/load-testing/initial-test.js new file mode 100644 index 00000000000..de2de341e5c --- /dev/null +++ b/sites/public/load-testing/initial-test.js @@ -0,0 +1,205 @@ +/* eslint-disable import/no-unresolved */ +import { browser } from "k6/browser" +import { sleep } from "k6" + +export const options = { + scenarios: { + default: { + executor: "ramping-vus", + startVUs: 0, + gracefulRampDown: "0s", + options: { + browser: { type: "chromium" }, + }, + stages: [ + { duration: "30s", target: 1 }, + { duration: "30s", target: 1 }, + { duration: "30s", target: 2 }, + { duration: "30s", target: 2 }, + { duration: "30s", target: 3 }, + { duration: "30s", target: 3 }, + ], + // vus: 10, + // iterations: 100, + }, + }, +} + +const randomNumber = (min = 1, max = 5) => Math.floor(Math.random() * (max - min) + min) +const randomString = (stringLength = 5) => + (Math.random() + 1).toString(36).substring(2, stringLength + 2) + +const clickNext = async (page, waitFor = false) => { + await page.getByRole("button", { name: "Next", exact: true }).click() + //TODO: get rid of sleep + await sleep(randomNumber()) + const text = await page.getByRole("button", { name: waitFor ? waitFor : "Next", exact: true }) + await text.waitFor({ + state: "visible", + }) +} + +export default async function () { + const page = await browser.newPage() + + try { + await page.goto("https://core-dev.bloomhousing.dev/") + + await page.getByRole("link", { name: "Listings", exact: true }).click() + + await page.getByRole("link", { name: "Blue Sky Apartments", exact: true }).click() + + await page.getByRole("link", { name: "Apply online", exact: true }).click() + + await page.locator("section").click() + + await page.locator("div:nth-of-type(2) > button:nth-of-type(1)").click() + + await clickNext(page) + + await page + .getByRole("textbox", { name: "First or given name", exact: true }) + .fill(randomString()) + + await page + .getByRole("textbox", { name: "Middle name (optional)", exact: true }) + .fill(randomString()) + + await page + .getByRole("textbox", { name: "Last or family name", exact: true }) + .fill(randomString()) + + await page.getByRole("textbox", { name: "Month", exact: true }).fill(`${randomNumber(1, 12)}`) + + await page.getByRole("textbox", { name: "Day", exact: true }).fill(`${randomNumber(1, 27)}`) + + await page + .getByRole("textbox", { name: "Year", exact: true }) + .fill(`${randomNumber(1980, 2005)}`) + + await page + .getByRole("textbox", { name: "Your email address", exact: true }) + .fill(`example+${randomString(10)}@exygy.com`) + + await clickNext(page) + + await page.getByRole("textbox", { name: "Number", exact: true }).fill("(520) 123-4567") + + await page.locator("section").click() + + await page + .getByRole("combobox", { + name: "What type of number is this?", + exact: true, + }) + .selectOption("home") + + await page + .getByRole("textbox", { name: "Street address", exact: true }) + .fill("2325 eastborne st") + + await page.getByRole("textbox", { name: "Apt or unit #", exact: true }).fill("1/2") + + await page.getByRole("textbox", { name: "City name", exact: true }).fill("los angeles") + + await page.getByRole("combobox", { name: "State", exact: true }).selectOption("AL") + + await page.getByRole("combobox", { name: "State", exact: true }).selectOption("AZ") + + await page.getByRole("textbox", { name: "Zip code", exact: true }).fill("90025") + + await clickNext(page) + + await page.getByRole("checkbox", { name: "Letter", exact: true }).click() + + await page.getByRole("radio", { name: "No", exact: true }).check() + + await clickNext(page) + + await clickNext(page) + + const text = await page.getByRole("radio", { name: "have an alternate contact", exact: false }) + await text.waitFor({ + state: "visible", + }) + + await page.getByRole("radio", { name: "have an alternate contact", exact: false }).click() + + await clickNext(page) + + await page.getByRole("radio", { name: "I will live alone", exact: true }).click() + + await clickNext(page) + + await page.locator(".font-semibold").click() + + await clickNext(page) + + await page.locator("div:nth-of-type(4) .font-semibold").click() + + await clickNext(page) + + await page.locator("div:nth-of-type(2) > div .font-semibold").click() + + await page.locator(".seeds-card > div:nth-of-type(3)").click() + + await clickNext(page) + + await page.locator("div:nth-of-type(2) > div .font-semibold").click() + + await clickNext(page) + + await page.locator("div:nth-of-type(1) > div > div > .font-semibold").click() + + await page.locator(".seeds-card > div:nth-of-type(3)").click() + + await clickNext(page) + + await page + .getByRole("textbox", { + name: "What is your household total pre-tax income?", + exact: true, + }) + .fill("5000") + + await page.locator("div:nth-of-type(1) > div > div > .font-semibold").click() + + await page.locator(".seeds-card > div:nth-of-type(3)").click() + + await clickNext(page) + + await page.locator('[data-divider="inset"] div:nth-of-type(2) .font-semibold').click() + + await page + .locator("div:nth-of-type(2) > div > div:nth-of-type(1) > div > .font-semibold") + .click() + + await page + .getByRole("combobox", { + name: "Which best describes your ethnicity?", + exact: true, + }) + .selectOption("notHispanicLatino") + + await page.locator(".border-none div:nth-of-type(5) .font-semibold").click() + + await clickNext(page, "Confirm") + + await page.getByRole("button", { name: "Confirm", exact: true }).click() + + await page.locator(".font-semibold").click() + + await page.getByRole("button", { name: "Submit", exact: true }).click() + + await page + .getByRole("link", { + name: "View submitted application and print a copy.", + exact: true, + }) + .click() + + await sleep(1) + } finally { + await page?.close() + } +} diff --git a/sites/public/load-testing/old-headless.js b/sites/public/load-testing/old-headless.js new file mode 100644 index 00000000000..9aac30e4c31 --- /dev/null +++ b/sites/public/load-testing/old-headless.js @@ -0,0 +1,177 @@ +/* eslint-disable import/no-unresolved */ +import { group, sleep, check } from "k6" +import http from "k6/http" + +export const options = { + vus: 500, + iterations: 10000, +} + +const randomString = (stringLength = 5) => + (Math.random() + 1).toString(36).substring(2, stringLength + 2) + +export default function () { + let params + let resp + let url + + group("Default group", function () { + // home page get + params = { + headers: { + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-ch-ua-mobile": `?0`, + "sec-ch-ua-platform": `"macOS"`, + "upgrade-insecure-requests": `1`, + accept: `text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7`, + "sec-fetch-site": `none`, + "sec-fetch-mode": `navigate`, + "sec-fetch-user": `?1`, + "sec-fetch-dest": `document`, + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + priority: `u=0, i`, + }, + cookies: {}, + } + url = http.url`https://core-dev.bloomhousing.dev/` + resp = http.request("GET", url, null, params) + check(resp, { "home page get": (r) => r.status === 200 }) + + // jurisdictions get + params = { + headers: { + language: `en`, + "sec-ch-ua-platform": `"macOS"`, + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-ch-ua-mobile": `?0`, + jurisdictionname: `Bloomington`, + appurl: `https://core-dev.bloomhousing.dev`, + accept: `application/json, text/plain, */*`, + "sec-fetch-site": `same-origin`, + "sec-fetch-mode": `cors`, + "sec-fetch-dest": `empty`, + referer: `https://core-dev.bloomhousing.dev/applications/start/choose-language?listingId=5fdfd253-d270-48e4-92ee-793ec5beda78`, + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + priority: `u=1, i`, + }, + cookies: {}, + } + url = http.url`https://core-dev.bloomhousing.dev/api/adapter/jurisdictions/2bc7a6c3-13b2-4a7e-9a98-2f47d9686ba5` + resp = http.request("GET", url, null, params) + check(resp, { "jurisdictions get 1": (r) => r.status === 200 }) + + // listings get + params = { + headers: { + language: `en`, + "sec-ch-ua-platform": `"macOS"`, + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-ch-ua-mobile": `?0`, + jurisdictionname: `Bloomington`, + appurl: `https://core-dev.bloomhousing.dev`, + accept: `application/json, text/plain, */*`, + "sec-fetch-site": `same-origin`, + "sec-fetch-mode": `cors`, + "sec-fetch-dest": `empty`, + referer: `https://core-dev.bloomhousing.dev/applications/start/choose-language?listingId=5fdfd253-d270-48e4-92ee-793ec5beda78`, + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + "if-none-match": `"89n9pbkw5fd51"`, + priority: `u=1, i`, + }, + cookies: {}, + } + url = http.url`https://core-dev.bloomhousing.dev/api/adapter/listings/5fdfd253-d270-48e4-92ee-793ec5beda78` + resp = http.request("GET", url, null, params) + check(resp, { "listing get": (r) => r.status === 200 }) + + // jurisdiction get + params = { + headers: { + language: `en`, + "sec-ch-ua-platform": `"macOS"`, + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-ch-ua-mobile": `?0`, + jurisdictionname: `Bloomington`, + appurl: `https://core-dev.bloomhousing.dev`, + accept: `application/json, text/plain, */*`, + "sec-fetch-site": `same-origin`, + "sec-fetch-mode": `cors`, + "sec-fetch-dest": `empty`, + referer: `https://core-dev.bloomhousing.dev/applications/start/choose-language?listingId=5fdfd253-d270-48e4-92ee-793ec5beda78`, + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + priority: `u=1, i`, + }, + cookies: {}, + } + url = http.url`https://core-dev.bloomhousing.dev/api/adapter/jurisdictions/2bc7a6c3-13b2-4a7e-9a98-2f47d9686ba5` + resp = http.request("GET", url, null, params) + check(resp, { "jurisdiction get 2": (r) => r.status === 200 }) + + // verify application + params = { + headers: { + language: `en`, + "sec-ch-ua-platform": `"macOS"`, + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-ch-ua-mobile": `?0`, + jurisdictionname: `Bloomington`, + appurl: `https://core-dev.bloomhousing.dev`, + accept: `application/json, text/plain, */*`, + "content-type": `application/json`, + origin: `https://core-dev.bloomhousing.dev`, + "sec-fetch-site": `same-origin`, + "sec-fetch-mode": `cors`, + "sec-fetch-dest": `empty`, + referer: `https://core-dev.bloomhousing.dev/applications/review/summary`, + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + priority: `u=1, i`, + }, + cookies: {}, + } + url = http.url`https://core-dev.bloomhousing.dev/api/adapter/applications/verify` + resp = http.request( + "POST", + url, + `{"loaded":false,"autofilled":false,"completedSections":6,"submissionType":"electronical","language":"en","acceptedTerms":true,"status":"submitted","accessibleUnitWaitlistNumber":null,"conventionalUnitWaitlistNumber":null,"manualLotteryPositionNumber":null,"applicant":{"phoneNumberType":"","noPhone":true,"applicantAddress":{"street":"2024 1st Street","city":"Napa","state":"CA","zipCode":"94559","county":"","longitude":-122.29551,"latitude":38.297914},"workInRegion":"no","phoneNumber":"","firstName":"Eric","middleName":"","lastName":"McGarry","birthMonth":"02","birthDay":"12","birthYear":"1998","emailAddress":"eric.mcgarry@exygy.com","noEmail":false,"fullTimeStudent":null,"applicantWorkAddress":{"street":"","street2":"","city":"","state":"","zipCode":"","county":""}},"additionalPhone":false,"additionalPhoneNumber":"","additionalPhoneNumberType":"","contactPreferences":["email"],"householdSize":1,"housingStatus":"","sendMailToMailingAddress":false,"applicationsMailingAddress":{"street":"","street2":"","city":"","state":"","zipCode":""},"applicationsAlternateAddress":{"street":"","street2":"","city":"","state":"","zipCode":""},"alternateContact":null,"accessibility":{"mobility":false,"vision":false,"hearing":false,"other":null},"householdExpectingChanges":false,"householdStudent":false,"reasonableAccommodations":"","incomeVouchers":false,"income":"1234.00","incomePeriod":"perYear","householdMember":[],"preferredUnitTypes":[{"id":"ee78d841-c49a-487d-b316-834037673338"}],"demographics":{"ethnicity":"","gender":"","sexualOrientation":"","howDidYouHear":[],"race":[],"spokenLanguage":""},"preferences":[{"multiselectQuestionId":"fe910943-d01f-4900-bd3e-b62782d61740","key":"City Employees","claimed":true,"options":[{"key":"At least one member of my household is a city employee","checked":true,"extraData":[]}]}],"programs":[{"multiselectQuestionId":"6cef9823-d856-404e-83e1-d77c0f0caf3b","key":"Veteran","claimed":true,"options":[{"key":"Yes","checked":true,"extraData":[]}]}],"applicationSelections":[],"confirmationCode":"","id":"","reachedReviewStep":true,"reviewStatus":"pending","listings":{"id":"5fdfd253-d270-48e4-92ee-793ec5beda78"},"appUrl":"https://core-dev.bloomhousing.dev"}`, + params + ) + + check(resp, { "verify ": (r) => r.status === 201 }) + + // application submission + params = { + headers: { + language: `en`, + "sec-ch-ua-platform": `"macOS"`, + "sec-ch-ua": `"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"`, + "sec-ch-ua-mobile": `?0`, + jurisdictionname: `Bloomington`, + appurl: `https://core-dev.bloomhousing.dev`, + accept: `application/json, text/plain, */*`, + "content-type": `application/json`, + origin: `https://core-dev.bloomhousing.dev`, + "sec-fetch-site": `same-origin`, + "sec-fetch-mode": `cors`, + "sec-fetch-dest": `empty`, + referer: `https://core-dev.bloomhousing.dev/applications/review/terms`, + "accept-encoding": `gzip, deflate, br, zstd`, + "accept-language": `en-US,en;q=0.9`, + priority: `u=1, i`, + }, + cookies: {}, + } + url = http.url`https://core-dev.bloomhousing.dev/api/adapter/applications/submit` + resp = http.request( + "POST", + url, + `{"loaded":false,"autofilled":false,"completedSections":6,"submissionType":"electronical","language":"en","acceptedTerms":true,"status":"submitted","accessibleUnitWaitlistNumber":null,"conventionalUnitWaitlistNumber":null,"manualLotteryPositionNumber":null,"applicant":{"phoneNumberType":"","noPhone":true,"applicantAddress":{"street":"2024 1st Street","city":"Napa","state":"CA","zipCode":"94559","county":"","longitude":-122.29551,"latitude":38.297914},"workInRegion":"no","phoneNumber":"","firstName":"Eric","middleName":"","lastName":"McGarry","birthMonth":"02","birthDay":"12","birthYear":"1998","emailAddress":"eric.mcgarry@exygy.com","noEmail":false,"fullTimeStudent":null,"applicantWorkAddress":{"street":"","street2":"","city":"","state":"","zipCode":"","county":""}},"additionalPhone":false,"additionalPhoneNumber":"","additionalPhoneNumberType":"","contactPreferences":["email"],"householdSize":1,"housingStatus":"","sendMailToMailingAddress":false,"applicationsMailingAddress":{"street":"","street2":"","city":"","state":"","zipCode":""},"applicationsAlternateAddress":{"street":"","street2":"","city":"","state":"","zipCode":""},"alternateContact":null,"accessibility":{"mobility":false,"vision":false,"hearing":false,"other":null},"householdExpectingChanges":false,"householdStudent":false,"reasonableAccommodations":"","incomeVouchers":false,"income":"1234.00","incomePeriod":"perYear","householdMember":[],"preferredUnitTypes":[{"id":"ee78d841-c49a-487d-b316-834037673338"}],"demographics":{"ethnicity":"","gender":"","sexualOrientation":"","howDidYouHear":[],"race":[],"spokenLanguage":""},"preferences":[{"multiselectQuestionId":"fe910943-d01f-4900-bd3e-b62782d61740","key":"City Employees","claimed":true,"options":[{"key":"At least one member of my household is a city employee","checked":true,"extraData":[]}]}],"programs":[{"multiselectQuestionId":"6cef9823-d856-404e-83e1-d77c0f0caf3b","key":"Veteran","claimed":true,"options":[{"key":"Yes","checked":true,"extraData":[]}]}],"applicationSelections":[],"confirmationCode":"","id":"","reachedReviewStep":true,"reviewStatus":"pending","listings":{"id":"5fdfd253-d270-48e4-92ee-793ec5beda78"},"appUrl":"https://core-dev.bloomhousing.dev"}`, + params + ) + check(resp, { "submission ": (r) => r.status === 201 }) + }) +}