diff --git a/model/storage-private/src/main/java/org/keycloak/storage/datastore/DefaultExportImportManager.java b/model/storage-private/src/main/java/org/keycloak/storage/datastore/DefaultExportImportManager.java index 1a899b23e26..496f73cc714 100644 --- a/model/storage-private/src/main/java/org/keycloak/storage/datastore/DefaultExportImportManager.java +++ b/model/storage-private/src/main/java/org/keycloak/storage/datastore/DefaultExportImportManager.java @@ -1592,12 +1592,12 @@ public class DefaultExportImportManager implements ExportImportManager { OrganizationModel org = provider.create(orgRep.getName()); org.setDomains(orgRep.getDomains().stream().map(r -> new OrganizationDomainModel(r.getName(), r.isVerified())).collect(Collectors.toSet())); - for (IdentityProviderRepresentation identityProvider : orgRep.getIdentityProviders()) { + for (IdentityProviderRepresentation identityProvider : Optional.ofNullable(orgRep.getIdentityProviders()).orElse(Collections.emptyList())) { IdentityProviderModel idp = newRealm.getIdentityProviderByAlias(identityProvider.getAlias()); provider.addIdentityProvider(org, idp); } - for (UserRepresentation member : orgRep.getMembers()) { + for (UserRepresentation member : Optional.ofNullable(orgRep.getMembers()).orElse(Collections.emptyList())) { UserModel m = session.users().getUserByUsername(newRealm, member.getUsername()); provider.addMember(org, m); } diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/organization/exportimport/OrganizationExportTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/organization/exportimport/OrganizationExportTest.java index 46c1c230407..5fabad354b8 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/organization/exportimport/OrganizationExportTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/organization/exportimport/OrganizationExportTest.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import jakarta.ws.rs.core.Response; import org.hamcrest.Matchers; import org.junit.Test; import org.keycloak.admin.client.resource.OrganizationResource; @@ -109,25 +110,7 @@ public class OrganizationExportTest extends AbstractOrganizationTest { } } - // export - TestingExportImportResource exportImport = testingClient.testing().exportImport(); - exportImport.setProvider(SingleFileExportProviderFactory.PROVIDER_ID); - exportImport.setAction(ExportImportConfig.ACTION_EXPORT); - exportImport.setRealmName(testRealm().toRepresentation().getRealm()); - String targetFilePath = exportImport.getExportImportTestDirectory() + File.separator + "org-export.json"; - exportImport.setFile(targetFilePath); - exportImport.runExport(); - - // remove the realm and import it back - testRealm().remove(); - exportImport = testingClient.testing().exportImport(); - exportImport.setProvider(SingleFileImportProviderFactory.PROVIDER_ID); - exportImport.setAction(ExportImportConfig.ACTION_IMPORT); - exportImport.setFile(targetFilePath); - exportImport.runImport(); - getCleanup().addCleanup(() -> testRealm().remove()); - - RealmRepresentation importedRealm = testRealm().toRepresentation(); + RealmRepresentation importedRealm = exportRemoveImportRealm(); assertTrue(importedRealm.isOrganizationsEnabled()); @@ -158,6 +141,47 @@ public class OrganizationExportTest extends AbstractOrganizationTest { assertThat(appPage.getRequestType(),is(AppPage.RequestType.AUTH_RESPONSE)); } + @Test + public void testExportImportEmptyOrg() { + OrganizationRepresentation orgRep = createRepresentation("acme", "acme.com"); + + try (Response response = testRealm().organizations().create(orgRep)) { + assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus()); + } + List orgs = testRealm().organizations().getAll(); + assertEquals(1, orgs.size()); + + RealmRepresentation importedRealm = exportRemoveImportRealm(); + + assertTrue(importedRealm.isOrganizationsEnabled()); + + orgs = testRealm().organizations().getAll(); + assertEquals(1, orgs.size()); + assertEquals("acme", orgs.get(0).getName()); + } + + private RealmRepresentation exportRemoveImportRealm() { + //export + TestingExportImportResource exportImport = testingClient.testing().exportImport(); + exportImport.setProvider(SingleFileExportProviderFactory.PROVIDER_ID); + exportImport.setAction(ExportImportConfig.ACTION_EXPORT); + exportImport.setRealmName(testRealm().toRepresentation().getRealm()); + String targetFilePath = exportImport.getExportImportTestDirectory() + File.separator + "org-export.json"; + exportImport.setFile(targetFilePath); + exportImport.runExport(); + + // remove the realm and import it back + testRealm().remove(); + exportImport = testingClient.testing().exportImport(); + exportImport.setProvider(SingleFileImportProviderFactory.PROVIDER_ID); + exportImport.setAction(ExportImportConfig.ACTION_IMPORT); + exportImport.setFile(targetFilePath); + exportImport.runImport(); + getCleanup().addCleanup(() -> testRealm().remove()); + + return testRealm().toRepresentation(); + } + @Test public void testPartialExport() { createOrganization();