diff --git a/src/main/kotlin/com/workos/organizations/OrganizationsApi.kt b/src/main/kotlin/com/workos/organizations/OrganizationsApi.kt index 4d7b7a82..a882ee9e 100644 --- a/src/main/kotlin/com/workos/organizations/OrganizationsApi.kt +++ b/src/main/kotlin/com/workos/organizations/OrganizationsApi.kt @@ -24,6 +24,8 @@ class OrganizationsApi(private val workos: WorkOS) { * @param allowProfilesOutsideOrganization Whether the Connections within this Organization should allow Profiles that do not have a domain that is present in the set of the Organization's User Email Domains. * @param domainData A list of data for the domains of the organization. * @param domains A list of domains for the organization. + * @param externalId The external ID of the organization. + * @param metadata Object containing metadata key/value pairs associated with the organization. */ @JsonInclude(Include.NON_NULL) class CreateOrganizationOptions @JvmOverloads constructor( @@ -36,7 +38,13 @@ class OrganizationsApi(private val workos: WorkOS) { val domainData: List? = null, @Deprecated("Use domainData instead.") - val domains: List? = null + val domains: List? = null, + + @JsonProperty("external_id") + val externalId: String? = null, + + @JsonProperty("metadata") + val metadata: Map? = null, ) { /** * Builder class for creating [CreateOrganizationOptions]. @@ -50,6 +58,10 @@ class OrganizationsApi(private val workos: WorkOS) { private var domains: List? = null + private var externalId: String? = null + + private var metadata: Map? = null + /** * Sets the name of the organization. */ @@ -72,11 +84,21 @@ class OrganizationsApi(private val workos: WorkOS) { @Deprecated("Use domainData instead.") fun domains(value: List) = apply { domains = value } + /** + * Sets the external ID for the organization. + */ + fun externalId(value: String) = apply { externalId = value } + + /** + * Sets the metadata for the organization. + */ + fun metadata(value: Map) = apply { metadata = value } + /** * Creates an instance of [CreateOrganizationOptions] with the given params. */ fun build(): CreateOrganizationOptions { - return CreateOrganizationOptions(name, allowProfilesOutsideOrganization, domainData, domains) + return CreateOrganizationOptions(name, allowProfilesOutsideOrganization, domainData, domains, externalId, metadata) } } @@ -220,6 +242,9 @@ class OrganizationsApi(private val workos: WorkOS) { * @param allowProfilesOutsideOrganization Whether the Connections within this Organization should allow Profiles that do not have a domain that is present in the set of the Organization's User Email Domains. * @param domainData A list of data for the domains of the organization. * @param domains A list of domains for the organization. + * @param stripeCustomerId The Stripe customer ID associated with this organization. + * @param externalId The external ID of the organization. + * @param metadata Object containing metadata key/value pairs associated with the organization. */ @JsonInclude(Include.NON_NULL) class UpdateOrganizationOptions @JvmOverloads constructor( @@ -232,7 +257,16 @@ class OrganizationsApi(private val workos: WorkOS) { val domainData: List? = null, @Deprecated("Use domainData instead.") - val domains: List? = null + val domains: List? = null, + + @JsonProperty("stripe_customer_id") + val stripeCustomerId: String? = null, + + @JsonProperty("external_id") + val externalId: String? = null, + + @JsonProperty("metadata") + val metadata: Map? = null, ) { /** * Builder class for [UpdateOrganizationOptions]. @@ -246,6 +280,12 @@ class OrganizationsApi(private val workos: WorkOS) { private var domains: List? = null + private var stripeCustomerId: String? = null + + private var externalId: String? = null + + private var metadata: Map? = null + /** * Sets the name of the organization. */ @@ -268,11 +308,26 @@ class OrganizationsApi(private val workos: WorkOS) { @Deprecated("Use domainData instead.") fun domains(value: List) = apply { domains = value } + /** + * Sets the Stripe customer ID associated with this organization. + */ + fun stripeCustomerId(value: String) = apply { stripeCustomerId = value } + + /** + * Sets the external ID for the organization. + */ + fun externalId(value: String) = apply { externalId = value } + + /** + * Sets the metadata for the organization. + */ + fun metadata(value: Map) = apply { metadata = value } + /** * Creates an instance of [UpdateOrganizationOptions]. */ fun build(): UpdateOrganizationOptions { - return UpdateOrganizationOptions(name, allowProfilesOutsideOrganization, domainData, domains) + return UpdateOrganizationOptions(name, allowProfilesOutsideOrganization, domainData, domains, stripeCustomerId, externalId, metadata) } } diff --git a/src/main/kotlin/com/workos/organizations/models/Organization.kt b/src/main/kotlin/com/workos/organizations/models/Organization.kt index c1eb4005..82eda797 100644 --- a/src/main/kotlin/com/workos/organizations/models/Organization.kt +++ b/src/main/kotlin/com/workos/organizations/models/Organization.kt @@ -14,6 +14,9 @@ import com.fasterxml.jackson.annotation.JsonProperty * @param domains List of [OrganizationDomain]s. * @param createdAt The timestamp of when the Organization was created. * @param updatedAt The timestamp of when the Organization was updated. + * @param stripeCustomerId The Stripe customer ID associated with this organization. + * @param externalId The external ID of the Organization. + * @param metadata Object containing metadata key/value pairs associated with the Organization. */ data class Organization @JsonCreator constructor( @@ -40,5 +43,14 @@ data class Organization @JvmField @JsonProperty("updated_at") - val updatedAt: String + val updatedAt: String, + + @JsonProperty("stripe_customer_id") + val stripeCustomerId: String? = null, + + @JsonProperty("external_id") + val externalId: String? = null, + + @JsonProperty("metadata") + val metadata: Map? = null, ) diff --git a/src/main/kotlin/com/workos/usermanagement/UserManagementApi.kt b/src/main/kotlin/com/workos/usermanagement/UserManagementApi.kt index a6cd9a7b..0da9fd07 100644 --- a/src/main/kotlin/com/workos/usermanagement/UserManagementApi.kt +++ b/src/main/kotlin/com/workos/usermanagement/UserManagementApi.kt @@ -27,6 +27,7 @@ import com.workos.usermanagement.models.OrganizationMemberships import com.workos.usermanagement.models.PasswordReset import com.workos.usermanagement.models.RefreshAuthentication import com.workos.usermanagement.models.User +import com.workos.usermanagement.models.UserResponse import com.workos.usermanagement.models.Users import com.workos.usermanagement.types.AuthenticationAdditionalOptions import com.workos.usermanagement.types.CreateMagicAuthOptions @@ -355,13 +356,15 @@ class UserManagementApi(private val workos: WorkOS) { /** Sets a new password using the `token` query parameter from the link that the user received. */ fun resetPassword(token: String, newPassword: String): User { - return workos.post( + val userResponse = workos.post( "/user_management/password_reset/confirm", - User::class.java, + UserResponse::class.java, RequestConfig.builder() .data(ResetPasswordOptionsBuilder.create(token, newPassword).build()) .build() ) + + return userResponse.user } /** Get the details of an existing organization membership. */ diff --git a/src/main/kotlin/com/workos/usermanagement/builders/AbstractUserOptionsBuilder.kt b/src/main/kotlin/com/workos/usermanagement/builders/AbstractUserOptionsBuilder.kt index d218fa79..dd505e73 100644 --- a/src/main/kotlin/com/workos/usermanagement/builders/AbstractUserOptionsBuilder.kt +++ b/src/main/kotlin/com/workos/usermanagement/builders/AbstractUserOptionsBuilder.kt @@ -12,6 +12,8 @@ import com.workos.usermanagement.types.PasswordHashTypeEnumType * @param firstName The first name of the user. * @param lastName The last name of the user. * @param emailVerified Whether the user’s email address was previously verified. + * @param externalId The external ID of the user. + * @param metadata Object containing metadata key/value pairs associated with the user. */ abstract class AbstractUserOptionsBuilder @JvmOverloads constructor( open var password: String? = null, @@ -20,6 +22,8 @@ abstract class AbstractUserOptionsBuilder @JvmOverloads construct open var firstName: String? = null, open var lastName: String? = null, open var emailVerified: Boolean? = null, + open var externalId: String? = null, + open var metadata: Map? = null, ) { /** * Password @@ -55,6 +59,16 @@ abstract class AbstractUserOptionsBuilder @JvmOverloads construct */ fun emailVerified(value: Boolean) = apply { emailVerified = value } + /** + * External ID + */ + fun externalId(value: String) = apply { externalId = value } + + /** + * Metadata + */ + fun metadata(value: Map) = apply { metadata = value } + /** * Generates the options object. */ diff --git a/src/main/kotlin/com/workos/usermanagement/builders/CreateUserOptionsBuilder.kt b/src/main/kotlin/com/workos/usermanagement/builders/CreateUserOptionsBuilder.kt index c0bd05af..afb1b536 100644 --- a/src/main/kotlin/com/workos/usermanagement/builders/CreateUserOptionsBuilder.kt +++ b/src/main/kotlin/com/workos/usermanagement/builders/CreateUserOptionsBuilder.kt @@ -13,6 +13,8 @@ import com.workos.usermanagement.types.PasswordHashTypeEnumType * @param firstName The first name of the user. * @param lastName The last name of the user. * @param emailVerified Whether the user’s email address was previously verified. + * @param externalId The external ID of the user. + * @param metadata Object containing metadata key/value pairs associated with the user. */ class CreateUserOptionsBuilder @JvmOverloads constructor( val email: String, @@ -22,13 +24,17 @@ class CreateUserOptionsBuilder @JvmOverloads constructor( override var firstName: String? = null, override var lastName: String? = null, override var emailVerified: Boolean? = null, + override var externalId: String? = null, + override var metadata: Map? = null, ) : AbstractUserOptionsBuilder( password, passwordHash, passwordHashType, firstName, lastName, - emailVerified + emailVerified, + externalId, + metadata ) { /** * Generates the CreateUserOptions object. @@ -42,6 +48,8 @@ class CreateUserOptionsBuilder @JvmOverloads constructor( firstName = this.firstName, lastName = this.lastName, emailVerified = this.emailVerified, + externalId = this.externalId, + metadata = this.metadata ) } diff --git a/src/main/kotlin/com/workos/usermanagement/builders/UpdateUserOptionsBuilder.kt b/src/main/kotlin/com/workos/usermanagement/builders/UpdateUserOptionsBuilder.kt index 5193f5da..d5eeeb9f 100644 --- a/src/main/kotlin/com/workos/usermanagement/builders/UpdateUserOptionsBuilder.kt +++ b/src/main/kotlin/com/workos/usermanagement/builders/UpdateUserOptionsBuilder.kt @@ -14,6 +14,8 @@ import com.workos.usermanagement.types.UpdateUserOptions * @param password The password to set for the user. * @param passwordHash The hashed password to set for the user. Mutually exclusive with password. * @param passwordHashType The algorithm originally used to hash the password, used when providing a password_hash. + * @param externalId The external ID of the user. + * @param metadata Object containing metadata key/value pairs associated with the user. */ class UpdateUserOptionsBuilder @JvmOverloads constructor( val id: String, @@ -24,13 +26,17 @@ class UpdateUserOptionsBuilder @JvmOverloads constructor( override var password: String? = null, override var passwordHash: String? = null, override var passwordHashType: PasswordHashTypeEnumType? = null, + override var externalId: String? = null, + override var metadata: Map? = null, ) : AbstractUserOptionsBuilder( password, passwordHash, passwordHashType, firstName, lastName, - emailVerified + emailVerified, + externalId, + metadata ) { /** * Generates the UpdateUserOptions object. @@ -45,6 +51,8 @@ class UpdateUserOptionsBuilder @JvmOverloads constructor( password = this.password, passwordHash = this.passwordHash, passwordHashType = this.passwordHashType, + externalId = this.externalId, + metadata = this.metadata ) } diff --git a/src/main/kotlin/com/workos/usermanagement/models/User.kt b/src/main/kotlin/com/workos/usermanagement/models/User.kt index 97f6f8a6..458c8595 100644 --- a/src/main/kotlin/com/workos/usermanagement/models/User.kt +++ b/src/main/kotlin/com/workos/usermanagement/models/User.kt @@ -15,6 +15,8 @@ import com.fasterxml.jackson.annotation.JsonProperty * @param lastSignInAt The timestamp when the user last signed in. * @param createdAt The timestamp when the user was created. * @param updatedAt The timestamp when the user was last updated. + * @param externalId The external ID of the user. + * @param metadata Object containing metadata key/value pairs associated with the user. */ data class User @JsonCreator constructor( @JsonProperty("id") @@ -42,5 +44,11 @@ data class User @JsonCreator constructor( val createdAt: String, @JsonProperty("updated_at") - val updatedAt: String + val updatedAt: String, + + @JsonProperty("external_id") + val externalId: String? = null, + + @JsonProperty("metadata") + val metadata: Map, ) diff --git a/src/main/kotlin/com/workos/usermanagement/models/UserResponse.kt b/src/main/kotlin/com/workos/usermanagement/models/UserResponse.kt new file mode 100644 index 00000000..f07a3868 --- /dev/null +++ b/src/main/kotlin/com/workos/usermanagement/models/UserResponse.kt @@ -0,0 +1,15 @@ +package com.workos.usermanagement.models + +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty + +/** + * A response containing a WorkOS user. + * + * @param user The corresponding user object. + */ +data class UserResponse @JsonCreator constructor( + + @JsonProperty("user") + val user: User, +) diff --git a/src/main/kotlin/com/workos/usermanagement/types/CreateUserOptions.kt b/src/main/kotlin/com/workos/usermanagement/types/CreateUserOptions.kt index b36d7319..2fe64d8d 100644 --- a/src/main/kotlin/com/workos/usermanagement/types/CreateUserOptions.kt +++ b/src/main/kotlin/com/workos/usermanagement/types/CreateUserOptions.kt @@ -47,7 +47,19 @@ class CreateUserOptions @JvmOverloads constructor( * You should normally use the email verification flow to verify a user’s email address. However, if the user’s email was previously verified, or is being migrated from an existing user store, this can be set to true to mark it as already verified. */ @JsonProperty("email_verified") - val emailVerified: Boolean? = null + val emailVerified: Boolean? = null, + + /** + * The external ID of the user. + */ + @JsonProperty("external_id") + val externalId: String? = null, + + /** + * Object containing metadata key/value pairs associated with the user. + */ + @JsonProperty("metadata") + val metadata: Map? = null ) { init { require(email.isNotBlank()) { "Email is required" } diff --git a/src/main/kotlin/com/workos/usermanagement/types/UpdateUserOptions.kt b/src/main/kotlin/com/workos/usermanagement/types/UpdateUserOptions.kt index 0e8e59ab..799c7522 100644 --- a/src/main/kotlin/com/workos/usermanagement/types/UpdateUserOptions.kt +++ b/src/main/kotlin/com/workos/usermanagement/types/UpdateUserOptions.kt @@ -51,7 +51,19 @@ class UpdateUserOptions @JvmOverloads constructor( * The algorithm originally used to hash the password, used when providing a password_hash. */ @JsonProperty("password_hash_type") - val passwordHashType: PasswordHashTypeEnumType? = null + val passwordHashType: PasswordHashTypeEnumType? = null, + + /** + * The external ID of the user. + */ + @JsonProperty("external_id") + val externalId: String? = null, + + /** + * Object containing metadata key/value pairs associated with the user. + */ + @JsonProperty("metadata") + val metadata: Map? = null ) { init { require(id.isNotBlank()) { "User id is required" } diff --git a/src/test/kotlin/com/workos/test/organizations/OrganizationsApiTest.kt b/src/test/kotlin/com/workos/test/organizations/OrganizationsApiTest.kt index 864b3ed4..26ee0a87 100644 --- a/src/test/kotlin/com/workos/test/organizations/OrganizationsApiTest.kt +++ b/src/test/kotlin/com/workos/test/organizations/OrganizationsApiTest.kt @@ -1,6 +1,6 @@ package com.workos.test.organizations -import com.github.tomakehurst.wiremock.client.WireMock.* // ktlint-disable no-wildcard-imports +import com.github.tomakehurst.wiremock.client.WireMock.equalTo import com.workos.common.exceptions.UnauthorizedException import com.workos.organizations.OrganizationsApi import com.workos.organizations.OrganizationsApi.CreateOrganizationOptions @@ -14,12 +14,14 @@ import com.workos.test.TestBase import org.junit.jupiter.api.Assertions.assertThrows import kotlin.test.Test import kotlin.test.assertEquals +import kotlin.test.assertNull class OrganizationsApiTest : TestBase() { private fun prepareCreateOrganizationTest(body: String): Map { val organizationId = "org_01FJYCNTB6VC4K5R8BTF86286Q" val organizationDomainId = "org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8" val organizationDomainName = "Test Organization" + val organizationExternalId = "external_12345" stubResponse( url = "/organizations", @@ -36,7 +38,11 @@ class OrganizationsApiTest : TestBase() { "object": "organization_domain", "id": "$organizationDomainId" } - ] + ], + "external_id": "$organizationExternalId", + "metadata": { + "tier": "pro" + } }""", requestBody = body ) @@ -44,7 +50,9 @@ class OrganizationsApiTest : TestBase() { return mapOf( "organizationId" to organizationId, "organizationDomainId" to organizationDomainId, - "organizationDomainName" to organizationDomainName + "organizationDomainName" to organizationDomainName, + "externalId" to organizationExternalId, + "metadataTier" to "pro", ) } @@ -57,10 +65,13 @@ class OrganizationsApiTest : TestBase() { ) val organization = workos.organizations.createOrganization() + val metadata = organization.metadata assertEquals(data["organizationId"], organization.id) assertEquals(data["organizationDomainName"], organization.name) assertEquals(data["organizationDomainId"], organization.domains[0].id) + assertEquals(data["externalId"], organization.externalId) + assertEquals(data["metadataTier"], metadata?.get("tier")) } @Test @@ -76,7 +87,11 @@ class OrganizationsApiTest : TestBase() { "domain": "example.com", "state": "pending" } - ] + ], + "external_id": "external_12345", + "metadata": { + "tier": "pro" + } }""" ) @@ -91,13 +106,18 @@ class OrganizationsApiTest : TestBase() { ) ) ) + .externalId("external_12345") + .metadata(mapOf("tier" to "pro")) .build() val organization = workos.organizations.createOrganization(config) + val metadata = organization.metadata assertEquals(data["organizationId"], organization.id) assertEquals(data["organizationDomainName"], organization.name) assertEquals(data["organizationDomainId"], organization.domains[0].id) + assertEquals(data["externalId"], organization.externalId) + assertEquals(data["metadataTier"], metadata?.get("tier")) } @Test @@ -119,10 +139,13 @@ class OrganizationsApiTest : TestBase() { .build() val organization = workos.organizations.createOrganization(config) + val metadata = organization.metadata assertEquals(data["organizationId"], organization.id) assertEquals(data["organizationDomainName"], organization.name) assertEquals(data["organizationDomainId"], organization.domains[0].id) + assertEquals(data["externalId"], organization.externalId) + assertEquals(data["metadataTier"], metadata?.get("tier")) } @Test @@ -163,10 +186,13 @@ class OrganizationsApiTest : TestBase() { null ) ) + val metadata = organization.metadata assertEquals(data["organizationId"], organization.id) assertEquals(data["organizationDomainName"], organization.name) assertEquals(data["organizationDomainId"], organization.domains[0].id) + assertEquals(data["externalId"], organization.externalId) + assertEquals(data["metadataTier"], metadata?.get("tier")) } @Test @@ -206,6 +232,8 @@ class OrganizationsApiTest : TestBase() { ) assertEquals("Organization Name", organization.name) + assertNull(organization.externalId) + assertNull(organization.metadata) } @Test @@ -267,7 +295,8 @@ class OrganizationsApiTest : TestBase() { "verification_strategy": "dns", "verification_token": "rqURsMUCuiaSggGyed8ZAnMk" } - ] + ], + "external_id": "external_12345" }""" ) @@ -279,6 +308,7 @@ class OrganizationsApiTest : TestBase() { assertEquals(OrganizationDomainState.Verified, organization.domains[0].state) assertEquals(OrganizationDomainVerificationStrategy.Dns, organization.domains[0].verificationStrategy) assertEquals("rqURsMUCuiaSggGyed8ZAnMk", organization.domains[0].verificationToken) + assertEquals("external_12345", organization.externalId) } @Test @@ -327,6 +357,7 @@ class OrganizationsApiTest : TestBase() { assertEquals(OrganizationDomainState.Verified, organizations.get(0).domains[0].state) assertEquals(OrganizationDomainVerificationStrategy.Dns, organizations.get(0).domains[0].verificationStrategy) assertEquals("rqURsMUCuiaSggGyed8ZAnMk", organizations.get(0).domains[0].verificationToken) + assertNull(organizations.get(0).externalId) } @Test @@ -430,6 +461,8 @@ class OrganizationsApiTest : TestBase() { val organizationId = "org_01FJYCNTB6VC4K5R8BTF86286Q" val organizationDomainId = "org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8" val organizationDomainName = "Test Organization" + val organizationStripeCustomerId = "cus_R9qWAGMQ6nGE7V" + val organizationExternalId = "external_12345" stubResponse( url = "/organizations/$organizationId", @@ -446,7 +479,9 @@ class OrganizationsApiTest : TestBase() { "object": "organization_domain", "id": "$organizationDomainId" } - ] + ], + "stripe_customer_id": "cus_R9qWAGMQ6nGE7V", + "external_id": "$organizationExternalId" }""", requestBody = body ) @@ -454,7 +489,9 @@ class OrganizationsApiTest : TestBase() { return mapOf( "organizationId" to organizationId, "organizationDomainId" to organizationDomainId, - "organizationDomainName" to organizationDomainName + "organizationDomainName" to organizationDomainName, + "organizationStripeCustomerId" to organizationStripeCustomerId, + "organizationExternalId" to organizationExternalId, ) } @@ -471,6 +508,8 @@ class OrganizationsApiTest : TestBase() { assertEquals(data["organizationId"], organization.id) assertEquals(data["organizationDomainName"], organization.name) assertEquals(data["organizationDomainId"], organization.domains[0].id) + assertEquals(data["organizationStripeCustomerId"], organization.stripeCustomerId) + assertEquals(data["organizationExternalId"], organization.externalId) } @Test @@ -486,7 +525,9 @@ class OrganizationsApiTest : TestBase() { "domain": "example.com", "state": "verified" } - ] + ], + "stripe_customer_id": "cus_R9qWAGMQ6nGE7V", + "external_id": "external_12345" }""" ) @@ -501,6 +542,8 @@ class OrganizationsApiTest : TestBase() { ) ) ) + .stripeCustomerId("cus_R9qWAGMQ6nGE7V") + .externalId("external_12345") .build() val organization = workos.organizations.updateOrganization(data["organizationId"]!!, config) @@ -508,6 +551,8 @@ class OrganizationsApiTest : TestBase() { assertEquals(data["organizationId"], organization.id) assertEquals(data["organizationDomainName"], organization.name) assertEquals(data["organizationDomainId"], organization.domains[0].id) + assertEquals(data["organizationStripeCustomerId"], organization.stripeCustomerId) + assertEquals(data["organizationExternalId"], organization.externalId) } @Test @@ -529,6 +574,8 @@ class OrganizationsApiTest : TestBase() { assertEquals(data["organizationId"], organization.id) assertEquals(data["organizationDomainName"], organization.name) assertEquals(data["organizationDomainId"], organization.domains[0].id) + assertEquals(data["organizationStripeCustomerId"], organization.stripeCustomerId) + assertEquals(data["organizationExternalId"], organization.externalId) } @Test @@ -548,7 +595,9 @@ class OrganizationsApiTest : TestBase() { "domain": "bar.com", "state": "verified" } - ] + ], + "stripe_customer_id": "cus_R9qWAGMQ6nGE7V", + "external_id": "external_12345" }""" ) @@ -568,12 +617,16 @@ class OrganizationsApiTest : TestBase() { ) ), null, + "cus_R9qWAGMQ6nGE7V", + "external_12345" ) ) assertEquals(data["organizationId"], organization.id) assertEquals(data["organizationDomainName"], organization.name) assertEquals(data["organizationDomainId"], organization.domains[0].id) + assertEquals(data["organizationStripeCustomerId"], organization.stripeCustomerId) + assertEquals(data["organizationExternalId"], organization.externalId) } @Test @@ -601,6 +654,8 @@ class OrganizationsApiTest : TestBase() { assertEquals(data["organizationId"], organization.id) assertEquals(data["organizationDomainName"], organization.name) assertEquals(data["organizationDomainId"], organization.domains[0].id) + assertEquals(data["organizationStripeCustomerId"], organization.stripeCustomerId) + assertEquals(data["organizationExternalId"], organization.externalId) } @Test diff --git a/src/test/kotlin/com/workos/test/user_management/UserManagementApiTest.kt b/src/test/kotlin/com/workos/test/user_management/UserManagementApiTest.kt index 7a4f48a9..9e21fccd 100644 --- a/src/test/kotlin/com/workos/test/user_management/UserManagementApiTest.kt +++ b/src/test/kotlin/com/workos/test/user_management/UserManagementApiTest.kt @@ -53,7 +53,11 @@ class UserManagementApiTest : TestBase() { "last_name": "User", "last_sign_in_at": "2021-06-25T19:07:33.155Z", "created_at": "2021-06-25T19:07:33.155Z", - "updated_at": "2021-06-25T19:07:33.155Z" + "updated_at": "2021-06-25T19:07:33.155Z", + "external_id": "external_123", + "metadata": { + "language": "en" + } }""" ) @@ -69,7 +73,9 @@ class UserManagementApiTest : TestBase() { "https://example.com/profile_picture.jpg", "2021-06-25T19:07:33.155Z", "2021-06-25T19:07:33.155Z", - "2021-06-25T19:07:33.155Z" + "2021-06-25T19:07:33.155Z", + "external_123", + mapOf("language" to "en"), ), user ) @@ -87,7 +93,8 @@ class UserManagementApiTest : TestBase() { "email": "test01@example.com", "last_sign_in_at": "2021-06-25T19:07:33.155Z", "created_at": "2021-06-25T19:07:33.155Z", - "updated_at": "2021-06-25T19:07:33.155Z" + "updated_at": "2021-06-25T19:07:33.155Z", + "metadata": {} } ], "list_metadata": { @@ -109,7 +116,9 @@ class UserManagementApiTest : TestBase() { null, "2021-06-25T19:07:33.155Z", "2021-06-25T19:07:33.155Z", - "2021-06-25T19:07:33.155Z" + "2021-06-25T19:07:33.155Z", + null, + emptyMap(), ), users.data[0] ) @@ -128,7 +137,8 @@ class UserManagementApiTest : TestBase() { "email": "test01@example.com", "last_sign_in_at": "2021-06-25T19:07:33.155Z", "created_at": "2021-06-25T19:07:33.155Z", - "updated_at": "2021-06-25T19:07:33.155Z" + "updated_at": "2021-06-25T19:07:33.155Z", + "metadata": {} } ], "list_metadata": { @@ -160,7 +170,9 @@ class UserManagementApiTest : TestBase() { null, "2021-06-25T19:07:33.155Z", "2021-06-25T19:07:33.155Z", - "2021-06-25T19:07:33.155Z" + "2021-06-25T19:07:33.155Z", + null, + emptyMap(), ), users.data[0] ) @@ -181,7 +193,11 @@ class UserManagementApiTest : TestBase() { "last_name": "User", "last_sign_in_at": "2021-06-25T19:07:33.155Z", "created_at": "2021-06-25T19:07:33.155Z", - "updated_at": "2021-06-25T19:07:33.155Z" + "updated_at": "2021-06-25T19:07:33.155Z", + "external_id": "external_123", + "metadata": { + "language": "en" + } }""", requestBody = """{ @@ -189,7 +205,11 @@ class UserManagementApiTest : TestBase() { "password": "password", "first_name": "Test", "last_name": "User", - "email_verified": true + "email_verified": true, + "external_id": "external_123", + "metadata": { + "language": "en" + } }""" ) @@ -199,6 +219,8 @@ class UserManagementApiTest : TestBase() { .firstName("Test") .lastName("User") .emailVerified(true) + .externalId("external_123") + .metadata(mapOf("language" to "en")) .build() val user = workos.userManagement.createUser(options) @@ -213,7 +235,9 @@ class UserManagementApiTest : TestBase() { null, "2021-06-25T19:07:33.155Z", "2021-06-25T19:07:33.155Z", - "2021-06-25T19:07:33.155Z" + "2021-06-25T19:07:33.155Z", + "external_123", + mapOf("language" to "en"), ), user ) @@ -233,7 +257,11 @@ class UserManagementApiTest : TestBase() { "last_name": "User", "last_sign_in_at": "2021-06-25T19:07:33.155Z", "created_at": "2021-06-25T19:07:33.155Z", - "updated_at": "2021-06-25T19:07:33.155Z" + "updated_at": "2021-06-25T19:07:33.155Z", + "external_id": "external_123", + "metadata": { + "language": "en" + } }""", requestBody = """{ @@ -241,7 +269,11 @@ class UserManagementApiTest : TestBase() { "password": "password", "first_name": "Test", "last_name": "User", - "email_verified": true + "email_verified": true, + "external_id": "external_123", + "metadata": { + "language": "en" + } }""" ) @@ -251,6 +283,8 @@ class UserManagementApiTest : TestBase() { .firstName("Test") .lastName("User") .emailVerified(true) + .externalId("external_123") + .metadata(mapOf("language" to "en")) .build() val user = workos.userManagement.updateUser("user_123", options) @@ -265,7 +299,9 @@ class UserManagementApiTest : TestBase() { null, "2021-06-25T19:07:33.155Z", "2021-06-25T19:07:33.155Z", - "2021-06-25T19:07:33.155Z" + "2021-06-25T19:07:33.155Z", + "external_123", + mapOf("language" to "en"), ), user ) @@ -410,7 +446,8 @@ class UserManagementApiTest : TestBase() { "email_verified": true, "profile_picture_url": null, "created_at": "2021-06-25T19:07:33.155Z", - "updated_at": "2021-06-25T19:07:33.155Z" + "updated_at": "2021-06-25T19:07:33.155Z", + "metadata": {} }, "organization_id": "org_456", "access_token": "access_token", @@ -460,7 +497,8 @@ class UserManagementApiTest : TestBase() { "email_verified": true, "profile_picture_url": null, "created_at": "2021-06-25T19:07:33.155Z", - "updated_at": "2021-06-25T19:07:33.155Z" + "updated_at": "2021-06-25T19:07:33.155Z", + "metadata": {} }, "organization_id": "org_456", "access_token": "access_token", @@ -510,7 +548,8 @@ class UserManagementApiTest : TestBase() { "email_verified": true, "profile_picture_url": null, "created_at": "2021-06-25T19:07:33.155Z", - "updated_at": "2021-06-25T19:07:33.155Z" + "updated_at": "2021-06-25T19:07:33.155Z", + "metadata": {} }, "organization_id": "org_456", "access_token": "access_token", @@ -558,9 +597,11 @@ class UserManagementApiTest : TestBase() { "email_verified": true, "profile_picture_url": null, "created_at": "2021-06-25T19:07:33.155Z", - "updated_at": "2021-06-25T19:07:33.155Z" + "updated_at": "2021-06-25T19:07:33.155Z", + "metadata": {} }, - "organization_id": "org_456" + "organization_id": "org_456", + "metadata": {} }""", requestBody = """{ @@ -639,7 +680,8 @@ class UserManagementApiTest : TestBase() { "email_verified": true, "profile_picture_url": null, "created_at": "2021-06-25T19:07:33.155Z", - "updated_at": "2021-06-25T19:07:33.155Z" + "updated_at": "2021-06-25T19:07:33.155Z", + "metadata": {} }, "organization_id": "org_456" }""", @@ -685,7 +727,8 @@ class UserManagementApiTest : TestBase() { "email_verified": true, "profile_picture_url": null, "created_at": "2021-06-25T19:07:33.155Z", - "updated_at": "2021-06-25T19:07:33.155Z" + "updated_at": "2021-06-25T19:07:33.155Z", + "metadata": {} }, "organization_id": "org_456" }""", @@ -733,7 +776,8 @@ class UserManagementApiTest : TestBase() { "email_verified": true, "profile_picture_url": null, "created_at": "2021-06-25T19:07:33.155Z", - "updated_at": "2021-06-25T19:07:33.155Z" + "updated_at": "2021-06-25T19:07:33.155Z", + "metadata": {} }, "organization_id": "org_456" }""", @@ -1085,16 +1129,19 @@ class UserManagementApiTest : TestBase() { stubResponse( "/user_management/password_reset/confirm", """{ - "object": "user", - "id": "user_123", - "email": "test01@example.com", - "email_verified": true, - "profile_picture_url": null, - "first_name": "Test", - "last_name": "User", - "last_sign_in_at": "2021-06-25T19:07:33.155Z", - "created_at": "2021-06-25T19:07:33.155Z", - "updated_at": "2021-06-25T19:07:33.155Z" + "user": { + "object": "user", + "id": "user_123", + "email": "test01@example.com", + "email_verified": true, + "profile_picture_url": null, + "first_name": "Test", + "last_name": "User", + "last_sign_in_at": "2021-06-25T19:07:33.155Z", + "created_at": "2021-06-25T19:07:33.155Z", + "updated_at": "2021-06-25T19:07:33.155Z", + "metadata": {} + } }""", requestBody = """{ @@ -1115,7 +1162,9 @@ class UserManagementApiTest : TestBase() { null, "2021-06-25T19:07:33.155Z", "2021-06-25T19:07:33.155Z", - "2021-06-25T19:07:33.155Z" + "2021-06-25T19:07:33.155Z", + null, + emptyMap() ), user ) diff --git a/src/test/kotlin/com/workos/test/webhooks/UserWebhookTests.kt b/src/test/kotlin/com/workos/test/webhooks/UserWebhookTests.kt index 088d8877..72f710c4 100644 --- a/src/test/kotlin/com/workos/test/webhooks/UserWebhookTests.kt +++ b/src/test/kotlin/com/workos/test/webhooks/UserWebhookTests.kt @@ -28,7 +28,9 @@ class UserWebhookTests : TestBase() { "profile_picture_url": "https://example.com/profile.jpg", "last_sign_in_at": "2023-11-27T18:00:00.000Z", "created_at": "2023-11-27T19:07:33.155Z", - "updated_at": "2023-11-27T19:07:33.155Z" + "updated_at": "2023-11-27T19:07:33.155Z", + "external_id": null, + "metadata": {} }, "created_at": "2023-11-27T19:07:33.155Z" }