/** * personium.io * Copyright 2014 FUJITSU LIMITED * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.fujitsu.dc.test.jersey.box.odatacol; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import org.apache.http.HttpStatus; import org.json.simple.JSONObject; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; import com.fujitsu.dc.test.categories.Integration; import com.fujitsu.dc.test.categories.Regression; import com.fujitsu.dc.test.categories.Unit; import com.fujitsu.dc.test.jersey.AbstractCase; import com.fujitsu.dc.test.jersey.DcRunner; import com.fujitsu.dc.test.jersey.ODataCommon; import com.fujitsu.dc.test.unit.core.UrlUtils; import com.fujitsu.dc.test.utils.AssociationEndUtils; import com.fujitsu.dc.test.utils.BoxUtils; import com.fujitsu.dc.test.utils.CellUtils; import com.fujitsu.dc.test.utils.DavResourceUtils; import com.fujitsu.dc.test.utils.EntityTypeUtils; import com.fujitsu.dc.test.utils.TResponse; import com.fujitsu.dc.test.utils.UserDataUtils; import com.sun.jersey.test.framework.WebAppDescriptor; /** * Propertyを定義したユーザデータの$link取得のテスト. */ @RunWith(DcRunner.class) @Category({Unit.class, Integration.class, Regression.class }) public class UserDataLinkPropertyTest extends AbstractUserDataTest { // セル再帰的削除を使用するために、あらかじめFilterクラスの設定が必要なため、staticメソッドで初期化しておく。 // また、親クラスとしてODataCommonクラスを指定する。 private static final Map<String, String> INIT_PARAMS = new HashMap<String, String>(); static { INIT_PARAMS.put("com.sun.jersey.config.property.packages", "com.fujitsu.dc.core.rs"); INIT_PARAMS.put("com.sun.jersey.spi.container.ContainerRequestFilters", "com.fujitsu.dc.core.jersey.filter.DcCoreContainerFilter"); INIT_PARAMS.put("com.sun.jersey.spi.container.ContainerResponseFilters", "com.fujitsu.dc.core.jersey.filter.DcCoreContainerFilter"); } private static final String CELL = "UserDataLinkPropertyTest" + "_cell"; private static final String BOX = "box"; private static final String COL = "COL"; private static final String PARENT_ENTITY = "parentEntity"; private static final String CHILD_ENTITY = "childEntity"; private static final String CHILD_ENTITY1 = CHILD_ENTITY + 1; private static final String CHILD_ENTITY2 = CHILD_ENTITY + 2; private static final String CHILD_ENTITY3 = CHILD_ENTITY + 3; private static final String CHILD_ENTITY4 = CHILD_ENTITY + 4; private static final String CHILD_ENTITY5 = CHILD_ENTITY + 5; private static final String CHILD_ENTITY6 = CHILD_ENTITY + 6; private static final String PROPERTY = "property"; private static final String ASSOCIATION_END_PARENT = "associcationEndParent"; private static final String ASSOCIATION_END_CHILD = "associcationEndChild"; /** * コンストラクタ. */ public UserDataLinkPropertyTest() { super(new WebAppDescriptor.Builder(INIT_PARAMS).build()); } /** * テスト用データの作成. */ @Before public void createTestData() { CellUtils.create(CELL, MASTER_TOKEN_NAME, HttpStatus.SC_CREATED); BoxUtils.create(CELL, BOX, MASTER_TOKEN_NAME, HttpStatus.SC_CREATED); DavResourceUtils.createODataCollection(MASTER_TOKEN_NAME, HttpStatus.SC_CREATED, CELL, BOX, COL); // 親EntityType作成 EntityTypeUtils.create(CELL, MASTER_TOKEN_NAME, BOX, COL, PARENT_ENTITY, HttpStatus.SC_CREATED); for (int j = 1; j <= 6; j++) { // テスト対象のEdm型の数 // 子EntityType作成 EntityTypeUtils.create(CELL, MASTER_TOKEN_NAME, BOX, COL, CHILD_ENTITY + j, HttpStatus.SC_CREATED); } UserDataUtils.createProperty(CELL, BOX, COL, PROPERTY, CHILD_ENTITY1, "Edm.String", true, null, null, false, null); UserDataUtils.createProperty(CELL, BOX, COL, PROPERTY, CHILD_ENTITY2, "Edm.Int32", true, null, null, false, null); UserDataUtils.createProperty(CELL, BOX, COL, PROPERTY, CHILD_ENTITY3, "Edm.Boolean", true, null, null, false, null); UserDataUtils.createProperty(CELL, BOX, COL, PROPERTY, CHILD_ENTITY4, "Edm.Single", true, null, null, false, null); UserDataUtils.createProperty(CELL, BOX, COL, PROPERTY, CHILD_ENTITY5, "Edm.Double", true, null, null, false, null); UserDataUtils.createProperty(CELL, BOX, COL, PROPERTY, CHILD_ENTITY6, "Edm.DateTime", true, null, null, false, null); } /** * テスト用データの削除. * @throws InterruptedException 例外 */ @After public void deleteTestData() throws InterruptedException { CellUtils.bulkDeletion(BEARER_MASTER_TOKEN, CELL); } /** * ユーザデータを作成する. */ @SuppressWarnings("unchecked") private void createUserData() { // ユーザデータ作成 // 親Entity JSONObject body = new JSONObject(); body.put("__id", "id"); UserDataUtils.create(MASTER_TOKEN_NAME, HttpStatus.SC_CREATED, body, CELL, BOX, COL, PARENT_ENTITY); // 子Entity for (int i = 1; i <= 6; i++) { switch (i) { case 1: // Edm.String body.put(PROPERTY, "123"); break; case 2: // Edm.Int32 body.put(PROPERTY, 123); break; case 3: // Edm.Boolean body.put(PROPERTY, true); break; case 4: // Edm.Single body.put(PROPERTY, 1.23); break; case 5: // Edm.Double body.put(PROPERTY, 1.23); break; case 6: // Edm.DateTime body.put(PROPERTY, "/Date(1234567890)/"); break; default: break; } UserDataUtils.createViaNP(MASTER_TOKEN_NAME, body, CELL, BOX, COL, PARENT_ENTITY, "id", CHILD_ENTITY + i, HttpStatus.SC_CREATED); } } /** * レスポンスをチェックする. */ private void checkListResponse() { for (int i = 1; i <= 6; i++) { TResponse response = UserDataUtils.listLink(CELL, BOX, COL, PARENT_ENTITY, "id", CHILD_ENTITY + i); ArrayList<String> expectedUriList = new ArrayList<String>(); expectedUriList.add(UrlUtils.userdata(CELL, BOX, COL, CHILD_ENTITY + i, "id")); ODataCommon.checkLinResponseBody(response.bodyAsJson(), expectedUriList); } } /** * 多重度0_1対1の$linkを取得してターゲット側のユーザODataのみが取得できること. */ @Test public final void 多重度0_1対1の$linkを取得してターゲット側のユーザODataのみが取得できること() { try { // AssociationEnd作成 for (int i = 1; i <= 6; i++) { AssociationEndUtils.create(MASTER_TOKEN_NAME, "0..1", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_PARENT + i, PARENT_ENTITY); AssociationEndUtils.create(MASTER_TOKEN_NAME, "1", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_CHILD + i, CHILD_ENTITY + i); AssociationEndUtils.createLink(AbstractCase.MASTER_TOKEN_NAME, CELL, BOX, COL, PARENT_ENTITY, CHILD_ENTITY + i, ASSOCIATION_END_PARENT + i, ASSOCIATION_END_CHILD + i, HttpStatus.SC_NO_CONTENT); } createUserData(); checkListResponse(); } catch (Exception e) { fail(e.getMessage()); } } /** * 多重度0_1対0_1の$linkを取得してターゲット側のユーザODataのみが取得できること. */ @Test public final void 多重度0_1対0_1の$linkを取得してターゲット側のユーザODataのみが取得できること() { try { // AssociationEnd作成 for (int i = 1; i <= 6; i++) { AssociationEndUtils.create(MASTER_TOKEN_NAME, "0..1", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_PARENT + i, PARENT_ENTITY); AssociationEndUtils.create(MASTER_TOKEN_NAME, "0..1", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_CHILD + i, CHILD_ENTITY + i); AssociationEndUtils.createLink(AbstractCase.MASTER_TOKEN_NAME, CELL, BOX, COL, PARENT_ENTITY, CHILD_ENTITY + i, ASSOCIATION_END_PARENT + i, ASSOCIATION_END_CHILD + i, HttpStatus.SC_NO_CONTENT); } createUserData(); checkListResponse(); } catch (Exception e) { fail(e.getMessage()); } } /** * 多重度0or1対Nの$linkを取得してターゲット側のユーザODataのみが取得できること. */ @Test public final void 多重度0or1対Nの$linkを取得してターゲット側のユーザODataのみが取得できること() { try { // AssociationEnd作成 for (int i = 1; i <= 6; i++) { AssociationEndUtils.create(MASTER_TOKEN_NAME, "0..1", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_PARENT + i, PARENT_ENTITY); AssociationEndUtils.create(MASTER_TOKEN_NAME, "*", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_CHILD + i, CHILD_ENTITY + i); AssociationEndUtils.createLink(AbstractCase.MASTER_TOKEN_NAME, CELL, BOX, COL, PARENT_ENTITY, CHILD_ENTITY + i, ASSOCIATION_END_PARENT + i, ASSOCIATION_END_CHILD + i, HttpStatus.SC_NO_CONTENT); } createUserData(); checkListResponse(); } catch (Exception e) { fail(e.getMessage()); } } /** * 多重度N対Nの$linkを取得してターゲット側のユーザODataのみが取得できること. */ @Test public final void 多重度N対Nの$linkを取得してターゲット側のユーザODataのみが取得できること() { try { // AssociationEnd作成 for (int i = 1; i <= 6; i++) { AssociationEndUtils.create(MASTER_TOKEN_NAME, "*", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_PARENT + i, PARENT_ENTITY); AssociationEndUtils.create(MASTER_TOKEN_NAME, "*", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_CHILD + i, CHILD_ENTITY + i); AssociationEndUtils.createLink(AbstractCase.MASTER_TOKEN_NAME, CELL, BOX, COL, PARENT_ENTITY, CHILD_ENTITY + i, ASSOCIATION_END_PARENT + i, ASSOCIATION_END_CHILD + i, HttpStatus.SC_NO_CONTENT); } createUserData(); checkListResponse(); } catch (Exception e) { fail(e.getMessage()); } } /** * 多重度1対0_1の$linkを取得してターゲット側のユーザODataのみが取得できること. */ @Test public final void 多重度1対0_1の$linkを取得してターゲット側のユーザODataのみが取得できること() { try { // AssociationEnd作成 for (int i = 1; i <= 6; i++) { AssociationEndUtils.create(MASTER_TOKEN_NAME, "1", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_PARENT + i, PARENT_ENTITY); AssociationEndUtils.create(MASTER_TOKEN_NAME, "0..1", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_CHILD + i, CHILD_ENTITY + i); AssociationEndUtils.createLink(AbstractCase.MASTER_TOKEN_NAME, CELL, BOX, COL, PARENT_ENTITY, CHILD_ENTITY + i, ASSOCIATION_END_PARENT + i, ASSOCIATION_END_CHILD + i, HttpStatus.SC_NO_CONTENT); } createUserData(); checkListResponse(); } catch (Exception e) { fail(e.getMessage()); } } /** * NP経由でのユーザOData一覧取得結果をチェックする. */ private void checkNpListResponse() { for (int i = 1; i <= 6; i++) { TResponse response = UserDataUtils.listViaNP(CELL, BOX, COL, PARENT_ENTITY, "id", CHILD_ENTITY + i, "", HttpStatus.SC_OK); Map<String, String> uri = new HashMap<String, String>(); uri.put("id", UrlUtils.userData(CELL, BOX, COL, CHILD_ENTITY + i + "('id')")); String nameSpace = getNameSpace(CHILD_ENTITY + i); // プロパティ Map<String, Map<String, Object>> additional = new HashMap<String, Map<String, Object>>(); Map<String, Object> additionalprop = new HashMap<String, Object>(); additional.put("id", additionalprop); additionalprop.put("__id", "id"); ODataCommon .checkResponseBodyList(response.bodyAsJson(), uri, nameSpace, additional, "__id", null, null); } } /** * 多重度0_1対1のNP経由一覧取得でターゲット側のユーザODataのみが取得できること. */ @Test public final void 多重度0_1対1のNP経由一覧取得でターゲット側のユーザODataのみが取得できること() { try { // AssociationEnd作成 for (int i = 1; i <= 6; i++) { AssociationEndUtils.create(MASTER_TOKEN_NAME, "0..1", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_PARENT + i, PARENT_ENTITY); AssociationEndUtils.create(MASTER_TOKEN_NAME, "1", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_CHILD + i, CHILD_ENTITY + i); AssociationEndUtils.createLink(AbstractCase.MASTER_TOKEN_NAME, CELL, BOX, COL, PARENT_ENTITY, CHILD_ENTITY + i, ASSOCIATION_END_PARENT + i, ASSOCIATION_END_CHILD + i, HttpStatus.SC_NO_CONTENT); } createUserData(); checkNpListResponse(); } catch (Exception e) { fail(e.getMessage()); } } /** * 多重度0_1対0_1のNP経由一覧取得でターゲット側のユーザODataのみが取得できること. */ @Test public final void 多重度0_1対0_1のNP経由一覧取得でターゲット側のユーザODataのみが取得できること() { try { // AssociationEnd作成 for (int i = 1; i <= 6; i++) { AssociationEndUtils.create(MASTER_TOKEN_NAME, "0..1", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_PARENT + i, PARENT_ENTITY); AssociationEndUtils.create(MASTER_TOKEN_NAME, "0..1", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_CHILD + i, CHILD_ENTITY + i); AssociationEndUtils.createLink(AbstractCase.MASTER_TOKEN_NAME, CELL, BOX, COL, PARENT_ENTITY, CHILD_ENTITY + i, ASSOCIATION_END_PARENT + i, ASSOCIATION_END_CHILD + i, HttpStatus.SC_NO_CONTENT); } createUserData(); checkNpListResponse(); } catch (Exception e) { fail(e.getMessage()); } } /** * 多重度0_1対NのNP経由一覧取得でターゲット側のユーザODataのみが取得できること. */ @Test public final void 多重度0_1対NのNP経由一覧取得でターゲット側のユーザODataのみが取得できること() { try { // AssociationEnd作成 for (int i = 1; i <= 6; i++) { AssociationEndUtils.create(MASTER_TOKEN_NAME, "0..1", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_PARENT + i, PARENT_ENTITY); AssociationEndUtils.create(MASTER_TOKEN_NAME, "*", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_CHILD + i, CHILD_ENTITY + i); AssociationEndUtils.createLink(AbstractCase.MASTER_TOKEN_NAME, CELL, BOX, COL, PARENT_ENTITY, CHILD_ENTITY + i, ASSOCIATION_END_PARENT + i, ASSOCIATION_END_CHILD + i, HttpStatus.SC_NO_CONTENT); } createUserData(); checkNpListResponse(); } catch (Exception e) { fail(e.getMessage()); } } /** * 多重度N対NのNP経由一覧取得でターゲット側のユーザODataのみが取得できること. */ @Test public final void 多重度N対NのNP経由一覧取得でターゲット側のユーザODataのみが取得できること() { try { // AssociationEnd作成 for (int i = 1; i <= 6; i++) { AssociationEndUtils.create(MASTER_TOKEN_NAME, "*", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_PARENT + i, PARENT_ENTITY); AssociationEndUtils.create(MASTER_TOKEN_NAME, "*", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_CHILD + i, CHILD_ENTITY + i); AssociationEndUtils.createLink(AbstractCase.MASTER_TOKEN_NAME, CELL, BOX, COL, PARENT_ENTITY, CHILD_ENTITY + i, ASSOCIATION_END_PARENT + i, ASSOCIATION_END_CHILD + i, HttpStatus.SC_NO_CONTENT); } createUserData(); checkNpListResponse(); } catch (Exception e) { fail(e.getMessage()); } } /** * 多重度1対0_1のNP経由一覧取得でターゲット側のユーザODataのみが取得できること. */ @Test public final void 多重度1対0_1のNP経由一覧取得でターゲット側のユーザODataのみが取得できること() { try { // AssociationEnd作成 for (int i = 1; i <= 6; i++) { AssociationEndUtils.create(MASTER_TOKEN_NAME, "1", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_PARENT + i, PARENT_ENTITY); AssociationEndUtils.create(MASTER_TOKEN_NAME, "0..1", CELL, BOX, COL, HttpStatus.SC_CREATED, ASSOCIATION_END_CHILD + i, CHILD_ENTITY + i); AssociationEndUtils.createLink(AbstractCase.MASTER_TOKEN_NAME, CELL, BOX, COL, PARENT_ENTITY, CHILD_ENTITY + i, ASSOCIATION_END_PARENT + i, ASSOCIATION_END_CHILD + i, HttpStatus.SC_NO_CONTENT); } createUserData(); checkNpListResponse(); } catch (Exception e) { fail(e.getMessage()); } } }