/* * Copyright 2010-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file 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.amazonaws.services.dynamodbv2.datamodeling; import java.util.*; import org.junit.*; import com.amazonaws.services.dynamodbv2.datamodeling.AttributeTransformer.Parameters; import com.amazonaws.services.dynamodbv2.model.AttributeValue; public class AttributeTransformerChainTest { @Test public void testTransformEmptyChain() { AttributeTransformer transformer = new AttributeTransformerChain( Collections.<AttributeTransformer>emptyList() ); Map<String, AttributeValue> values = new HashMap<String, AttributeValue>(); Parameters<?> params = new TestParameters<Object>(values); Map<String, AttributeValue> result = transformer.transform(params); Assert.assertSame(values, result); Assert.assertTrue(values.isEmpty()); } @Test public void testUntransformEmptyChain() { AttributeTransformer transformer = new AttributeTransformerChain( Collections.<AttributeTransformer>emptyList() ); Map<String, AttributeValue> values = new HashMap<String, AttributeValue>(); Parameters<?> params = new TestParameters<Object>(values); Map<String, AttributeValue> result = transformer.untransform(params); Assert.assertSame(values, result); Assert.assertTrue(values.isEmpty()); } @Test public void testTransform() { AttributeTransformer transformer1 = new TestTransformer(".one"); AttributeTransformer transformer2 = new TestTransformer(".two"); AttributeTransformer chain = new AttributeTransformerChain(transformer1, transformer2); Map<String, AttributeValue> values = new HashMap<String, AttributeValue>(); values.put("test1", new AttributeValue("foo")); values.put("test2", new AttributeValue("bar")); Parameters<?> params = new TestParameters<Object>(values); Map<String, AttributeValue> result = chain.transform(params); Assert.assertNotNull(result); Assert.assertEquals(2, result.size()); Assert.assertEquals("foo.one.two", result.get("test1").getS()); Assert.assertEquals("bar.one.two", result.get("test2").getS()); } @Test public void testUntransform() { AttributeTransformer transformer1 = new TestTransformer(".one"); AttributeTransformer transformer2 = new TestTransformer(".two"); AttributeTransformer chain = new AttributeTransformerChain(transformer1, transformer2); Map<String, AttributeValue> values = new HashMap<String, AttributeValue>(); values.put("test1", new AttributeValue("foo.one.two")); values.put("test2", new AttributeValue("bar.one.two")); Parameters<?> params = new TestParameters<Object>(values); Map<String, AttributeValue> result = chain.untransform(params); Assert.assertNotNull(result); Assert.assertEquals(2, result.size()); Assert.assertEquals("foo", result.get("test1").getS()); Assert.assertEquals("bar", result.get("test2").getS()); } @Test public void testRoundTrip() { AttributeTransformer transformer1 = new TestTransformer(".one"); AttributeTransformer transformer2 = new TestTransformer(".two"); AttributeTransformer chain = new AttributeTransformerChain(transformer1, transformer2); Map<String, AttributeValue> values = new HashMap<String, AttributeValue>(); values.put("test1", new AttributeValue("foo")); values.put("test2", new AttributeValue("bar")); Parameters<?> params = new TestParameters<Object>(values); Map<String, AttributeValue> result = chain.transform(params); params = new TestParameters<Object>(result); result = chain.untransform(params); Assert.assertEquals(values, result); } private static class TestTransformer implements AttributeTransformer { private final String appendMe; public TestTransformer(final String appendMe) { this.appendMe = appendMe; } @Override public Map<String, AttributeValue> transform( final Parameters<?> parameters) { Map<String, AttributeValue> rval = new HashMap<String, AttributeValue>(); for (Map.Entry<String, AttributeValue> entry : parameters.getAttributeValues().entrySet()) { rval.put(entry.getKey(), transform(entry.getValue())); } return rval; } @Override public Map<String, AttributeValue> untransform( final Parameters<?> parameters) { Map<String, AttributeValue> rval = new HashMap<String, AttributeValue>(); for (Map.Entry<String, AttributeValue> entry : parameters.getAttributeValues().entrySet()) { rval.put(entry.getKey(), untransform(entry.getValue())); } return rval; } private AttributeValue transform(AttributeValue value) { return new AttributeValue(value.getS() + appendMe); } private AttributeValue untransform(AttributeValue value) { String s = value.getS(); if (s.endsWith(appendMe)) { return new AttributeValue( s.substring(0, s.length() - appendMe.length())); } else { return value; } } } }