/* * SonarQube * Copyright (C) 2009-2017 SonarSource SA * mailto:info AT sonarsource DOT com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.sonar.db.property; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Supplier; import javax.annotation.CheckForNull; import javax.annotation.Nullable; import org.assertj.core.api.AbstractAssert; import org.sonar.db.DbTester; import static com.google.common.base.Preconditions.checkState; import static java.lang.Boolean.FALSE; import static java.lang.Boolean.TRUE; import static java.util.Objects.requireNonNull; final class PropertiesRowAssert extends AbstractAssert<PropertiesRowAssert, PropertiesRow> { PropertiesRowAssert(DbTester dbTester, String propertyKey, @Nullable Integer userId, @Nullable Integer componentId) { super( asInternalProperty( dbTester, () -> " where prop_key='" + propertyKey + "'" + " and user_id" + (userId == null ? " is null" : "='" + userId + "'") + " and resource_id" + (componentId == null ? " is null" : "='" + componentId + "'")), PropertiesRowAssert.class); } PropertiesRowAssert(DbTester dbTester, String key) { super(asInternalProperty(dbTester, () -> " where prop_key='" + key + "'"), PropertiesRowAssert.class); } PropertiesRowAssert(DbTester dbTester, long id) { super(asInternalProperty(dbTester, () -> " where id=" + id), PropertiesRowAssert.class); } @CheckForNull private static PropertiesRow asInternalProperty(DbTester dbTester, Supplier<String> whereClauseSupplier) { String whereClause = whereClauseSupplier.get(); List<Map<String, Object>> rows = dbTester.select( "select" + " prop_key as \"key\", user_id as \"userId\", resource_id as \"resourceId\", is_empty as \"isEmpty\", text_value as \"textValue\", clob_value as \"clobValue\", created_at as \"createdAt\"" + " from properties" + whereClause); checkState(rows.size() < 2, "More than one property found for where clause \"" + whereClause + "\""); if (rows.isEmpty()) { return null; } else { Map<String, Object> row = rows.iterator().next(); Long userId = (Long) row.get("userId"); return new PropertiesRow( (String) row.get("key"), userId == null ? null : userId.intValue(), (Long) row.get("resourceId"), toBoolean(row.get("isEmpty")), (String) row.get("textValue"), (String) row.get("clobValue"), (Long) row.get("createdAt")); } } private static Boolean toBoolean(Object flag) { if (flag instanceof Boolean) { return (Boolean) flag; } if (flag instanceof Long) { Long longBoolean = (Long) flag; return longBoolean.equals(1L); } throw new IllegalArgumentException("Unsupported object type returned for column \"isEmpty\": " + flag.getClass()); } public void doesNotExist() { isNull(); } public PropertiesRowAssert hasKey(String expected) { isNotNull(); if (!Objects.equals(actual.getKey(), expected)) { failWithMessage("Expected PropertiesRow to have column PROP_KEY to be <%s> but was <%s>", expected, actual.getKey()); } return this; } public PropertiesRowAssert hasNoUserId() { isNotNull(); if (actual.getUserId() != null) { failWithMessage("Expected PropertiesRow to have column USER_ID to be null but was <%s>", actual.getUserId()); } return this; } public PropertiesRowAssert hasUserId(int expected) { isNotNull(); if (!Objects.equals(actual.getUserId(), expected)) { failWithMessage("Expected PropertiesRow to have column USER_ID to be <%s> but was <%s>", true, actual.getUserId()); } return this; } public PropertiesRowAssert hasNoResourceId() { isNotNull(); if (actual.getResourceId() != null) { failWithMessage("Expected PropertiesRow to have column RESOURCE_ID to be null but was <%s>", actual.getResourceId()); } return this; } public PropertiesRowAssert hasResourceId(long expected) { isNotNull(); if (!Objects.equals(actual.getResourceId(), expected)) { failWithMessage("Expected PropertiesRow to have column RESOURCE_ID to be <%s> but was <%s>", true, actual.getResourceId()); } return this; } public PropertiesRowAssert isEmpty() { isNotNull(); if (!Objects.equals(actual.getEmpty(), TRUE)) { failWithMessage("Expected PropertiesRow to have column IS_EMPTY to be <%s> but was <%s>", true, actual.getEmpty()); } if (actual.getTextValue() != null) { failWithMessage("Expected PropertiesRow to have column TEXT_VALUE to be null but was <%s>", actual.getTextValue()); } if (actual.getClobValue() != null) { failWithMessage("Expected PropertiesRow to have column CLOB_VALUE to be null but was <%s>", actual.getClobValue()); } return this; } public PropertiesRowAssert hasTextValue(String expected) { isNotNull(); if (!Objects.equals(actual.getTextValue(), requireNonNull(expected))) { failWithMessage("Expected PropertiesRow to have column TEXT_VALUE to be <%s> but was <%s>", expected, actual.getTextValue()); } if (actual.getClobValue() != null) { failWithMessage("Expected PropertiesRow to have column CLOB_VALUE to be null but was <%s>", actual.getClobValue()); } if (!Objects.equals(actual.getEmpty(), FALSE)) { failWithMessage("Expected PropertiesRow to have column IS_EMPTY to be <%s> but was <%s>", false, actual.getEmpty()); } return this; } public PropertiesRowAssert hasClobValue(String expected) { isNotNull(); if (!Objects.equals(actual.getClobValue(), requireNonNull(expected))) { failWithMessage("Expected PropertiesRow to have column CLOB_VALUE to be <%s> but was <%s>", true, actual.getClobValue()); } if (actual.getTextValue() != null) { failWithMessage("Expected PropertiesRow to have column TEXT_VALUE to be null but was <%s>", actual.getTextValue()); } if (!Objects.equals(actual.getEmpty(), FALSE)) { failWithMessage("Expected PropertiesRow to have column IS_EMPTY to be <%s> but was <%s>", false, actual.getEmpty()); } return this; } public PropertiesRowAssert hasCreatedAt(long expected) { isNotNull(); if (!Objects.equals(actual.getCreatedAt(), expected)) { failWithMessage("Expected PropertiesRow to have column CREATED_AT to be <%s> but was <%s>", expected, actual.getCreatedAt()); } return this; } }