Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Experiment/whatsapp action UI mockup #40

Merged
merged 39 commits into from
Feb 10, 2025

Tests for WhatsApp message and template logic

8fa20af
Select commit
Loading
Failed to load commit list.
Sign in for the full log view
Merged

Experiment/whatsapp action UI mockup #40

Tests for WhatsApp message and template logic
8fa20af
Select commit
Loading
Failed to load commit list.
GitHub Actions / Vitest succeeded Feb 4, 2025 in 1s

236 passed, 0 failed and 0 skipped

Tests passed successfully

✅ reports/tests/test-results.xml

236 tests were completed in 16s with 236 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
src/index.test.ts 1✅ 3ms
src/lib/comps/forms/whatsapp/messages/builder/actions/actions.test.ts 14✅ 10ms
src/lib/comps/forms/whatsapp/messages/builder/actions/buttons.test.ts 8✅ 5ms
src/lib/comps/forms/whatsapp/messages/builder/actions/components.test.ts 8✅ 10ms
src/lib/comps/forms/whatsapp/messages/builder/actions/images.test.ts 12✅ 9ms
src/lib/comps/forms/whatsapp/messages/builder/actions/text.test.ts 8✅ 10ms
src/lib/comps/ui/form/controls/file_upload/upload.test.ts 6✅ 118ms
src/lib/schema/utils/openai.test.ts 2✅ 6ms
src/lib/schema/valibot-date.test.ts 17✅ 18ms
src/lib/schema/valibot-numbers.test.ts 14✅ 15ms
src/lib/schema/valibot-strings.test.ts 61✅ 40ms
src/lib/server/api/people/interactions.test.ts 3✅ 6ms
src/lib/server/hooks/handlers.test.ts 8✅ 5ms
src/lib/server/utils/openai/schemas/HTMLMeta.test.ts 5✅ 6ms
src/lib/utils/math/number.test.ts 18✅ 6ms
src/lib/utils/text/file_size.test.ts 9✅ 6ms
src/lib/utils/text/string.test.ts 19✅ 52ms
src/routes/(api)/api/v1/settings/secrets/secrets.test.ts 4✅ 8ms
src/routes/(api)/api/v1/settings/secrets/server.test.ts 4✅ 10ms
src/routes/(app)/people/[person_id]/activity_feed/notes/actions.test.ts 3✅ 31ms
src/routes/(app)/settings/admins/admins.test.ts 3✅ 31ms
src/routes/(app)/settings/admins/server.test.ts 3✅ 35ms
src/routes/(app)/settings/secrets/secrets.test.ts 3✅ 9ms
src/routes/(app)/settings/secrets/server.test.ts 3✅ 9ms

✅ src/index.test.ts

src/index.test.ts
  ✅ sum test > adds 1 + 2 to equal 3

✅ src/lib/comps/forms/whatsapp/messages/builder/actions/actions.test.ts

src/lib/comps/forms/whatsapp/messages/builder/actions/actions.test.ts
  ✅ createWhatsAppMessageAction > should append a new action when an array exists
  ✅ createWhatsAppMessageAction > should append a new buttonId if there is an existing buttonId with actions
  ✅ createWhatsAppMessageAction > should create a new array if id does not exist
  ✅ createWhatsAppMessageAction > should not mutate the original actions object
  ✅ createWhatsAppMessageAction > should handle an existing id with a non-array value gracefully
  ✅ createWhatsAppMessageAction > should not modify other ids in the actions object
  ✅ createEventRegistrationAction > should append a new action when an array exists
  ✅ createEventRegistrationAction > should append a new buttonId if there is an existing buttonId with actions
  ✅ createEventRegistrationAction > should create a new array if id does not exist
  ✅ createEventRegistrationAction > should not mutate the original actions object
  ✅ createEventRegistrationAction > should handle an existing id with a non-array value gracefully
  ✅ createEventRegistrationAction > should not modify other ids in the actions object
  ✅ updateEventRegistrationAction > should update event_id if action type is "register_for_event"
  ✅ updateEventRegistrationAction > should return the original action if type is not "register_for_event"

✅ src/lib/comps/forms/whatsapp/messages/builder/actions/buttons.test.ts

src/lib/comps/forms/whatsapp/messages/builder/actions/buttons.test.ts
  ✅ addButton > should add a button to an interactive message
  ✅ addButton > should convert a text message to an interactive message with a button
  ✅ addButton > should convert an image message to an interactive message with a button
  ✅ addButton > should return the original message if type is not interactive, text, or image
  ✅ removeButton > should remove a button from an interactive message
  ✅ removeButton > should convert an interactive message with one button into a text message
  ✅ removeButton > should convert an interactive message with an image and one button into an image message
  ✅ removeButton > should return the original message if it is not interactive

✅ src/lib/comps/forms/whatsapp/messages/builder/actions/components.test.ts

src/lib/comps/forms/whatsapp/messages/builder/actions/components.test.ts
  ✅ extractTemplateMessageParams > should extract header, body, and buttons
  ✅ interpolateTextParams > should replace placeholders with provided text
  ✅ templateMessageParamsIndexes > should return correct indexes for components
  ✅ extractComponents > should extract header, body, footer, and buttons
  ✅ countTextTemplatePlaceholders > should count the number of placeholders correctly
  ✅ extractTemplateMessageComponents > should extract message components
  ✅ createMessageComponentsFromTemplateComponents > should extract components from a template message
  ✅ createMessageComponentsFromTemplateComponents > should return an empty array for a non-template message type

✅ src/lib/comps/forms/whatsapp/messages/builder/actions/images.test.ts

src/lib/comps/forms/whatsapp/messages/builder/actions/images.test.ts
  ✅ removeImage > should convert an image message to a text message with its caption
  ✅ removeImage > should convert an image message to a text message with an empty caption if none exists
  ✅ removeImage > should remove the image from an interactive message while keeping the rest unchanged
  ✅ removeImage > should return the message unchanged if it is not an image or interactive message
  ✅ extractImageUrl > should return the image URL from an image message
  ✅ extractImageUrl > should return the image URL from an interactive message with an image header
  ✅ extractImageUrl > should return null for an interactive message without an image header
  ✅ extractImageUrl > should return null for a non-image message
  ✅ setImageUrl > should update the image URL in an image message
  ✅ setImageUrl > should set an image URL in an interactive message
  ✅ setImageUrl > should convert a text message to an image message while preserving the text as a caption
  ✅ setImageUrl > should return the message unchanged if it is not an image, text, or interactive message

✅ src/lib/comps/forms/whatsapp/messages/builder/actions/text.test.ts

src/lib/comps/forms/whatsapp/messages/builder/actions/text.test.ts
  ✅ extractText > should extract text from a text message
  ✅ extractText > should extract text from an interactive message
  ✅ extractText > should extract caption from an image message
  ✅ extractText > should return an empty string for other message types
  ✅ setText > should update the text body of a text message
  ✅ setText > should update the body text of an interactive message
  ✅ setText > should update the caption of an image message
  ✅ setText > should return the original message for unsupported types

✅ src/lib/comps/ui/form/controls/file_upload/upload.test.ts

src/lib/comps/ui/form/controls/file_upload/upload.test.ts
  ✅ checkFileType > should not throw an error if file type is allowed
  ✅ checkFileType > should throw an error if file type is not allowed
  ✅ checkFileType > should include all allowed types in the error message
  ✅ checkFileSize > should not throw an error if file size is within limit
  ✅ checkFileSize > should throw an error if file size exceeds limit
  ✅ checkFileSize > should format the max size correctly in the error message

✅ src/lib/schema/utils/openai.test.ts

src/lib/schema/utils/openai.test.ts
  ✅ Validation schemas for OpenAI integration > Accepts the specified types of schemas
  ✅ Validation schemas for OpenAI integration > Rejects invalid types of schemas

✅ src/lib/schema/valibot-date.test.ts

src/lib/schema/valibot-date.test.ts
  ✅ timestamp > should parse a timestamp
  ✅ timestamp > should parse a representation of a date, always outputting a JS date
  ✅ timestamp > should parse a Javascript date type
  ✅ timestamp > should throw an error if the input is not a valid date
  ✅ timestamp > should throw an error if the input is not a string
  ✅ timestamp > should throw an error if the input is null
  ✅ timestamp > should return a Date of the current time when undefined
  ✅ timestampNoDefault > should parse a timestamp
  ✅ timestampNoDefault > should parse a date
  ✅ timestampNoDefault > should throw an error if the input is not a valid date
  ✅ timestampNoDefault > should throw an error if the input is not a string
  ✅ timestampNoDefault > should throw an error if the input is null
  ✅ timestampNoDefault > should throw an error if the input is undefined
  ✅ isoTimestamp > should parse an ISO timestamp
  ✅ isoTimestamp > should output an ISO timestamp
  ✅ isoTimestamp > should throw an error if the input is not a string
  ✅ isoTimestamp > should throw an error if the input is a Date

✅ src/lib/schema/valibot-numbers.test.ts

src/lib/schema/valibot-numbers.test.ts
  ✅ id > should parse an integer id
  ✅ id > should throw an error if the input is not an integer
  ✅ id > should throw an error if the input is not a number
  ✅ id > should throw an error if the input is negative
  ✅ id > should throw an error if the input is zero
  ✅ id > should throw an error if the input is NaN
  ✅ integer > should parse an integer
  ✅ integer > should throw an error if the input is not an integer
  ✅ integer > should throw an error if the input is not a number
  ✅ count > should parse a count
  ✅ count > should throw an error if the input is not an integer
  ✅ count > should throw an error if the input is not a number
  ✅ count > should throw an error if the input is negative
  ✅ count > should parse a count of zero

✅ src/lib/schema/valibot-strings.test.ts

src/lib/schema/valibot-strings.test.ts
  ✅ shortString > should parse a short string
  ✅ shortString > should throw an error if the input is too long
  ✅ shortString > should throw an error if the input is not a string
  ✅ shortString > should throw an error if the input is null
  ✅ shortString > should parse even if the string is empty
  ✅ shortString > should parse a string that is the max length
  ✅ shortString > should throw an error if the input is too long
  ✅ shortStringNotEmpty > should parse a short string
  ✅ shortStringNotEmpty > should parse a string that is the max length
  ✅ shortStringNotEmpty > should throw an error if the input is too long
  ✅ shortStringNotEmpty > should throw an error if the input is not a string
  ✅ shortStringNotEmpty > should throw an error if the input is empty
  ✅ mediumString > should parse a medium string
  ✅ mediumString > should throw an error if the input is too long
  ✅ mediumString > should throw an error if the input is not a string
  ✅ mediumString > should throw an error if the input is null
  ✅ mediumString > should parse even if the string is empty
  ✅ mediumString > should parse a string that is the max length
  ✅ mediumString > should throw an error if the input is too long
  ✅ mediumStringNotEmpty > should parse a medium string
  ✅ mediumStringNotEmpty > should parse a string that is the max length
  ✅ mediumStringNotEmpty > should throw an error if the input is too long
  ✅ mediumStringNotEmpty > should throw an error if the input is not a string
  ✅ mediumStringNotEmpty > should throw an error if the input is empty
  ✅ longString > should parse a long string
  ✅ longString > should throw an error if the input is too long
  ✅ longString > should throw an error if the input is not a string
  ✅ longString > should throw an error if the input is null
  ✅ longString > should parse even if the string is empty
  ✅ longString > should parse a string that is the max length
  ✅ longString > should throw an error if the input is too long
  ✅ longStringNotEmpty > should parse a long string
  ✅ longStringNotEmpty > should parse a string that is the max length
  ✅ longStringNotEmpty > should throw an error if the input is too long
  ✅ longStringNotEmpty > should throw an error if the input is not a string
  ✅ longStringNotEmpty > should throw an error if the input is empty
  ✅ slug > should parse a slug
  ✅ slug > should throw an error if the input is not a string
  ✅ slug > should throw an error if the input is null
  ✅ slug > should throw an error if the input string is empty
  ✅ slug > should throw an error if the input is too long
  ✅ slug > should parse a string that is the max length
  ✅ slug > should throw an error if the input is not a slug
  ✅ slug > should parse a string that contains understores
  ✅ slug > should parse a string that contains dashes
  ✅ slug > should parse any slugified string that is between 1 character and the maximum length
  ✅ eamil > should return the email string for valid email addresses
  ✅ eamil > should throw for incorrect email addresses
  ✅ eamil > should throw for empty and whitespace-only strings
  ✅ eamil > should throw for emails with special characters in wrong places
  ✅ eamil > should throw for emails with spaces
  ✅ url > should return the url string for valid URLs
  ✅ url > should return the URL string even for that are not http or https
  ✅ url > should throw when receiving just a domain
  ✅ url > should throw when receiving non URL strings
  ✅ url > should throw when receiving input that is not a string
  ✅ url > should throw for empty and whitespace-only strings
  ✅ uuid > should parse a UUID
  ✅ uuid > should throw an error if the input is not a UUID
  ✅ uuid > should throw an error if the input is not a string
  ✅ uuid > should throw an error if the input is an empty string

✅ src/lib/server/api/people/interactions.test.ts

src/lib/server/api/people/interactions.test.ts
  ✅ Updating the notes that have been recorded on a person record > Should update the note and move the old note to the edit history
  ✅ Updating the notes that have been recorded on a person record > Should update a note with existing edit history and create a new entry at the end of the edit history array
  ✅ Updating the notes that have been recorded on a person record > Should throw an error when the previous note is not of type notes

✅ src/lib/server/hooks/handlers.test.ts

src/lib/server/hooks/handlers.test.ts
  ✅ detectSubdomain > should return false if the host is the root domain
  ✅ detectSubdomain > should return false if the host is localhost, regardless of the settings of the root domain
  ✅ detectSubdomain > should mistakenly return a root domain as a subdomain for multi-part ccTLDs/compound ccTLDs
  ✅ detectSubdomain > should return false even for multi-part ccTLDs/compound ccTLDs if the host is the root domain
  ✅ detectSubdomain > should return the subdomain if the host is not the root domain
  ✅ detectSubdomain > should return the correct subdomain when the host is localhost
  ✅ detectSubdomain > should return the subdomain even if the root domain is a multi-part ccTLD/compound ccTLD
  ✅ detectSubdomain > should return false if the subdomain is disallowed

✅ src/lib/server/utils/openai/schemas/HTMLMeta.test.ts

src/lib/server/utils/openai/schemas/HTMLMeta.test.ts
  ✅ JSONSchema definition for OpenAI html Metatag generation > Matches the valibot schema for the base HTML metatag object
  ✅ JSONSchema definition for OpenAI html Metatag generation > Matches the valibot schema for OpenGraph
  ✅ JSONSchema definition for OpenAI html Metatag generation > Matches the valibot schema for Twitter
  ✅ OpenAI html Metatag generation > Generates the expected html metatags
  ✅ OpenAI html Metatag generation > Calls the OpenAI API with the correct prompt

✅ src/lib/utils/math/number.test.ts

src/lib/utils/math/number.test.ts
  ✅ isBigger > should return true if a is bigger than b
  ✅ isBigger > should return false if a is smaller than b
  ✅ isBigger > should return false if a is equal to b
  ✅ isBigger > should return false if a is a negative number and b is a positive number
  ✅ isBigger > should return true if a is a positive number and b is a negative number
  ✅ isBigger > shouldn't be tricked by floating point precision
  ✅ isBigger > should return false if a is NaN
  ✅ isBigger > should return false if b is NaN
  ✅ isBigger > should return false if a and b are NaN
  ✅ isBigger > should return true if a is Infinity
  ✅ isBigger > should return false if b is Infinity
  ✅ isBigger > should return false if a is -Infinity
  ✅ isBigger > should return true if b is -Infinity
  ✅ isBigger > should return false if a is -Infinity and b is Infinity
  ✅ isBigger > should return true if a is Infinity and b is -Infinity
  ✅ isBigger > should return false if a is -0
  ✅ isBigger > should return false if b is -0
  ✅ isBigger > shouldn't be tricked by integer overflows

✅ src/lib/utils/text/file_size.test.ts

src/lib/utils/text/file_size.test.ts
  ✅ humanReadableFileSize > should return "0 B" for 0 bytes
  ✅ humanReadableFileSize > should return bytes in base 1024 by default
  ✅ humanReadableFileSize > should return bytes in SI base 1000 when `si` is true
  ✅ humanReadableFileSize > should handle larger units in base 1024
  ✅ humanReadableFileSize > should handle larger units in SI base 1000
  ✅ humanReadableFileSize > should round to the specified number of decimal places
  ✅ humanReadableFileSize > should handle negative byte values
  ✅ humanReadableFileSize > should handle edge cases for small values close to thresholds
  ✅ humanReadableFileSize > should handle extremely large values

✅ src/lib/utils/text/string.test.ts

src/lib/utils/text/string.test.ts
  ✅ addLineBreaks > should add line breaks to a string
  ✅ addLineBreaks > should convert all line breaks to <br> tags
  ✅ addLineBreaks > should convert multiple line breaks to multiple <br> tags
  ✅ sanitizeHTML > should remove script tags
  ✅ sanitizeHTML > should remove inline event handlers
  ✅ sanitizeHTML > should retain inline styles
  ✅ sanitizeHTML > removes event handlers like onerror from <img> tags
  ✅ sanitizeHTML > sanitizes invalid <svg> content by removing onload attributes and fixing structure
  ✅ sanitizeHTML > removes malicious <iframe> tags while preserving safe text
  ✅ sanitizeHTML > cleans <math> tags by removing dangerous xlink:href attributes
  ✅ sanitizeHTML > corrects malformed <table> structures, ensuring valid HTML output
  ✅ sanitizeHTML > sanitizes improperly nested <ul> and <a> tags and ensures valid structure
  ✅ Utility function to convert strings into slugs > Converts spaces to underscores
  ✅ Utility function to convert strings into slugs > Converts multiple spaces to a single underscore
  ✅ Utility function to convert strings into slugs > Converts dashes and semicolons to a single underscore
  ✅ Utility function to convert strings into slugs > Replaces multiple underscores with a single underscore
  ✅ Utility function to convert strings into slugs > Converts all strings to lowercase
  ✅ Utility function to convert strings into slugs > Strips accents and diacritics from latin characters
  ✅ Utility function to convert strings into slugs > Removes all non latin characters

✅ src/routes/(api)/api/v1/settings/secrets/secrets.test.ts

src/routes/(api)/api/v1/settings/secrets/secrets.test.ts
  ✅ PUT /settings/secrets > should update secrets successfully
  ✅ PUT /settings/secrets > should handle errors
  ✅ GET /settings/secrets > should read secrets successfully
  ✅ GET /settings/secrets > should handle errors

✅ src/routes/(api)/api/v1/settings/secrets/server.test.ts

src/routes/(api)/api/v1/settings/secrets/server.test.ts
  ✅ PUT /settings/secrets > should update secrets successfully
  ✅ PUT /settings/secrets > should handle errors
  ✅ GET /settings/secrets > should read secrets successfully
  ✅ GET /settings/secrets > should handle errors

✅ src/routes/(app)/people/[person_id]/activity_feed/notes/actions.test.ts

src/routes/(app)/people/[person_id]/activity_feed/notes/actions.test.ts
  ✅ updateNotes > should send a PUT request with sanitized notes
  ✅ updateNotes > should throw an error if the fetch request fails
  ✅ updateNotes > should sanitize HTML input in the notes

✅ src/routes/(app)/settings/admins/admins.test.ts

src/routes/(app)/settings/admins/admins.test.ts
  ✅ Admin List Page Server > loads admin list successfully
  ✅ Admin List Page Server > validates schema
  ✅ Edit Admin Page Server > loads single admin successfully

✅ src/routes/(app)/settings/admins/server.test.ts

src/routes/(app)/settings/admins/server.test.ts
  ✅ Admin List Page Server > loads admin list successfully
  ✅ Admin List Page Server > validates schema
  ✅ Edit Admin Page Server > loads single admin successfully

✅ src/routes/(app)/settings/secrets/secrets.test.ts

src/routes/(app)/settings/secrets/secrets.test.ts
  ✅ Secrets Page Server Load > should load secrets successfully
  ✅ Validation schema for secrets > Contains WHATSAPP_ACCESS_KEY key
  ✅ Validation schema for secrets > Accepts specified schemas, including any extra keys not defined in schema

✅ src/routes/(app)/settings/secrets/server.test.ts

src/routes/(app)/settings/secrets/server.test.ts
  ✅ Secrets Page Server Load > should load secrets successfully
  ✅ Validation schema for secrets > Contains WHATSAPP_ACCESS_KEY key
  ✅ Validation schema for secrets > Accepts specified schemas, including any extra keys not defined in schema