package se.bjurr.prnfb.service; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import static se.bjurr.prnfb.listener.PrnfbPullRequestAction.APPROVED; import static se.bjurr.prnfb.service.SettingsService.STORAGE_KEY; import static se.bjurr.prnfb.settings.PrnfbNotificationBuilder.prnfbNotificationBuilder; import static se.bjurr.prnfb.settings.PrnfbSettingsBuilder.prnfbSettingsBuilder; import static se.bjurr.prnfb.settings.PrnfbSettingsDataBuilder.prnfbSettingsDataBuilder; import static se.bjurr.prnfb.settings.USER_LEVEL.ADMIN; import static se.bjurr.prnfb.settings.USER_LEVEL.EVERYONE; import static se.bjurr.prnfb.test.Podam.populatedInstanceOf; import java.util.List; import java.util.Set; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import com.atlassian.bitbucket.permission.Permission; import com.atlassian.bitbucket.user.EscalatedSecurityContext; import com.atlassian.bitbucket.user.SecurityService; import com.atlassian.bitbucket.util.Operation; import com.atlassian.sal.api.pluginsettings.PluginSettingsFactory; import com.atlassian.sal.api.transaction.TransactionCallback; import com.atlassian.sal.api.transaction.TransactionTemplate; import com.google.gson.Gson; import se.bjurr.prnfb.presentation.dto.ON_OR_OFF; import se.bjurr.prnfb.settings.PrnfbButton; import se.bjurr.prnfb.settings.PrnfbNotification; import se.bjurr.prnfb.settings.PrnfbSettings; import se.bjurr.prnfb.settings.ValidationException; public class SettingsServiceTest { private EscalatedSecurityContext escalatedSecurityContext; private PrnfbNotification notification1; private final PluginSettingsMap pluginSettings = new PluginSettingsMap(); @Mock private PluginSettingsFactory pluginSettingsFactory; @Mock private SecurityService securityService; private SettingsService sut; private TransactionTemplate transactionTemplate; @Before public void before() throws ValidationException { initMocks(this); when(this.pluginSettingsFactory.createGlobalSettings()) // .thenReturn(this.pluginSettings); this.escalatedSecurityContext = new EscalatedSecurityContext() { @Override public void applyToRequest() {} @Override public <T, E extends Throwable> T call(Operation<T, E> arg0) throws E { return arg0.perform(); } @Override public EscalatedSecurityContext withPermission(Object arg0, Permission arg1) { return null; } @Override public EscalatedSecurityContext withPermission(Permission arg0) { return null; } @Override public EscalatedSecurityContext withPermissions(Set<Permission> arg0) { return null; } }; when(this.securityService.withPermission(Permission.ADMIN, "Getting config")) // .thenReturn(this.escalatedSecurityContext); this.transactionTemplate = new TransactionTemplate() { @Override public <T> T execute(TransactionCallback<T> action) { return action.doInTransaction(); } }; this.sut = new SettingsService( this.pluginSettingsFactory, this.transactionTemplate, this.securityService); this.notification1 = prnfbNotificationBuilder() // .withUrl("http://hej.com/") // .withProjectKey("projectKey") // .withRepositorySlug("repositorySlug") // .withTrigger(APPROVED) // .build(); } @Test public void testThatButtonCanBeAddedUpdatedAndDeleted() { PrnfbButton button1 = new PrnfbButton( null, "title", EVERYONE, ON_OR_OFF.off, "p1", "r1", "confirmationText", null); assertThat(this.sut.getButtons()) // .isEmpty(); this.sut.addOrUpdateButton(button1); assertThat(this.sut.getButtons()) // .containsExactly(button1); PrnfbButton button2 = new PrnfbButton( null, "title", EVERYONE, ON_OR_OFF.off, "p1", "r1", "confirmationText", null); this.sut.addOrUpdateButton(button2); assertThat(this.sut.getButtons()) // .containsExactly(button1, button2); PrnfbButton updated = new PrnfbButton( button1.getUuid(), "title2", ADMIN, ON_OR_OFF.off, "p1", "r1", "confirmationText", null); this.sut.addOrUpdateButton(updated); assertThat(this.sut.getButtons()) // .containsExactly(button2, updated); this.sut.deleteButton(button1.getUuid()); assertThat(this.sut.getButtons()) // .containsExactly(button2); PrnfbButton b2 = this.sut.getButton(button2.getUuid()); assertThat(b2) // .isEqualTo(button2); assertThat(b2.hashCode()) // .isEqualTo(button2.hashCode()); assertThat(b2.toString()) // .isEqualTo(button2.toString()); } @Test public void testThatButtonsCanBeRetrievedByProject() { PrnfbButton button1 = populatedInstanceOf(PrnfbButton.class); this.sut.addOrUpdateButton(button1); List<PrnfbButton> actual = this.sut.getButtons(button1.getProjectKey().get()); assertThat(actual) // .containsOnly(button1); } @Test public void testThatButtonsCanBeRetrievedByProjectAndRepo() { PrnfbButton button1 = populatedInstanceOf(PrnfbButton.class); this.sut.addOrUpdateButton(button1); List<PrnfbButton> actual = this.sut.getButtons(button1.getProjectKey().get(), button1.getRepositorySlug().get()); assertThat(actual) // .containsOnly(button1); } @Test public void testThatNotificationCanBeAddedUpdatedAndDeleted() throws ValidationException { assertThat(this.sut.getButtons()) // .isEmpty(); this.sut.addOrUpdateNotification(this.notification1); assertThat(this.sut.getNotifications()) // .containsExactly(this.notification1); PrnfbNotification notification2 = prnfbNotificationBuilder() // .withUrl("http://hej.com/") // .withTrigger(APPROVED) // .build(); this.sut.addOrUpdateNotification(notification2); assertThat(this.sut.getNotifications()) // .containsExactly(this.notification1, notification2); PrnfbNotification updated = prnfbNotificationBuilder() // .withUuid(this.notification1.getUuid()) // .withUrl("http://hej2.com/") // .withTrigger(APPROVED) // .build(); this.sut.addOrUpdateNotification(updated); assertThat(this.sut.getNotifications()) // .containsExactly(notification2, updated); this.sut.deleteNotification(this.notification1.getUuid()); assertThat(this.sut.getNotifications()) // .containsExactly(notification2); assertThat(this.sut.getNotifications().get(0).toString()) // .isEqualTo(notification2.toString()); assertThat(this.sut.getNotifications().get(0).hashCode()) // .isEqualTo(notification2.hashCode()); } @Test public void testThatNotificationsCanBeRetrievedByProject() throws ValidationException { this.sut.addOrUpdateNotification(this.notification1); List<PrnfbNotification> actual = this.sut.getNotifications(this.notification1.getProjectKey().orNull()); assertThat(actual) // .containsOnly(this.notification1); } @Test public void testThatNotificationsCanBeRetrievedByProjectAndRepo() throws ValidationException { this.sut.addOrUpdateNotification(this.notification1); List<PrnfbNotification> actual = this.sut.getNotifications( this.notification1.getProjectKey().orNull(), this.notification1.getRepositorySlug().orNull()); assertThat(actual) // .containsOnly(this.notification1); } @Test public void testThatNotificationsCanBeRetrievedByUuid() throws ValidationException { this.sut.addOrUpdateNotification(this.notification1); PrnfbNotification actual = this.sut.getNotification(this.notification1.getUuid()); assertThat(actual) // .isEqualTo(this.notification1); } @Test public void testThatPluginSettingsDataCanBeStored() { PrnfbSettings oldSettings = prnfbSettingsBuilder() // .setPrnfbSettingsData( // prnfbSettingsDataBuilder() // .setKeyStore("12") // .setKeyStorePassword("22") // .setKeyStoreType("33") // .setAdminRestriction(EVERYONE) // .setShouldAcceptAnyCertificate(false) // .build() // ) // .build(); String oldSettingsString = new Gson().toJson(oldSettings); this.pluginSettings.getPluginSettingsMap().put(STORAGE_KEY, oldSettingsString); PrnfbSettings newSettings = prnfbSettingsBuilder() // .setPrnfbSettingsData( // prnfbSettingsDataBuilder() // .setKeyStore("keyStore") // .setKeyStorePassword("keyStorePassword") // .setKeyStoreType("keyStoreType") // .setAdminRestriction(EVERYONE) // .setShouldAcceptAnyCertificate(true) // .build() // ) // .build(); this.sut.setPrnfbSettingsData(newSettings.getPrnfbSettingsData()); String expectedSettingsString = new Gson().toJson(newSettings); assertThat(this.pluginSettings.getPluginSettingsMap().get(STORAGE_KEY)) // .isEqualTo(expectedSettingsString); } @Test public void testThatSettingsCanBeRead() { PrnfbSettings oldSettings = prnfbSettingsBuilder() // .setPrnfbSettingsData( // prnfbSettingsDataBuilder() // .setKeyStore("12") // .setKeyStorePassword("22") // .setKeyStoreType("33") // .setAdminRestriction(EVERYONE) // .setShouldAcceptAnyCertificate(false) // .build() // ) // .build(); String oldSettingsString = new Gson().toJson(oldSettings); this.pluginSettings.getPluginSettingsMap().put(STORAGE_KEY, oldSettingsString); PrnfbSettings actual = this.sut.getPrnfbSettings(); assertThat(actual) // .isEqualTo(oldSettings); assertThat(actual.toString()) // .isEqualTo(oldSettings.toString()); assertThat(actual.hashCode()) // .isEqualTo(oldSettings.hashCode()); assertThat(this.sut.getPrnfbSettingsData()) // .isEqualTo(oldSettings.getPrnfbSettingsData()); assertThat(this.sut.getPrnfbSettingsData().toString()) // .isEqualTo(oldSettings.getPrnfbSettingsData().toString()); assertThat(this.sut.getPrnfbSettingsData().hashCode()) // .isEqualTo(oldSettings.getPrnfbSettingsData().hashCode()); } @Test public void testThatSettingsCanBeReadWhenNoneAreSaved() { this.pluginSettings.getPluginSettingsMap().put(STORAGE_KEY, null); PrnfbSettings actual = this.sut.getPrnfbSettings(); assertThat(actual) // .isNotNull(); } }