|
11 | 11 | import com.launchdarkly.sdk.server.DataModel.SegmentRule; |
12 | 12 | import com.launchdarkly.sdk.server.DataModel.Target; |
13 | 13 |
|
| 14 | +import com.launchdarkly.sdk.LDValue; |
| 15 | +import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.ItemDescriptor; |
| 16 | + |
14 | 17 | import org.junit.Test; |
15 | 18 |
|
| 19 | +import static com.launchdarkly.sdk.server.ModelBuilders.flagBuilder; |
| 20 | +import static com.launchdarkly.sdk.server.ModelBuilders.prerequisite; |
| 21 | +import static com.launchdarkly.sdk.server.ModelBuilders.segmentBuilder; |
16 | 22 | import static org.junit.Assert.assertEquals; |
| 23 | +import static org.junit.Assert.assertFalse; |
| 24 | +import static org.junit.Assert.assertNotSame; |
| 25 | +import static org.junit.Assert.assertNull; |
| 26 | +import static org.junit.Assert.assertSame; |
| 27 | +import static org.junit.Assert.assertTrue; |
17 | 28 |
|
18 | 29 | @SuppressWarnings("javadoc") |
19 | 30 | public class DataModelTest { |
@@ -108,4 +119,82 @@ private Segment segmentWithAllZeroValuedFields() { |
108 | 119 | // and no preprocessing has happened. |
109 | 120 | return new Segment(); |
110 | 121 | } |
| 122 | + |
| 123 | + @Test |
| 124 | + public void flagAndSegmentAreNotOverridesByDefault() { |
| 125 | + assertFalse(flagBuilder("f").build().isOverride()); |
| 126 | + assertFalse(segmentBuilder("s").build().isOverride()); |
| 127 | + assertFalse(((FeatureFlag) DataModel.FEATURES.deserialize("{\"key\":\"f\",\"version\":1}").getItem()).isOverride()); |
| 128 | + assertFalse(((Segment) DataModel.SEGMENTS.deserialize("{\"key\":\"s\",\"version\":1}").getItem()).isOverride()); |
| 129 | + } |
| 130 | + |
| 131 | + @Test |
| 132 | + public void markedFlagCopyCarriesMarkerAndSharesDataWithoutMutatingSource() { |
| 133 | + FeatureFlag source = flagBuilder("f").version(7).on(true).variations(LDValue.of("a"), LDValue.of("b")) |
| 134 | + .fallthroughVariation(1).offVariation(0).prerequisites(prerequisite("p", 1)).trackEvents(true) |
| 135 | + .debugEventsUntilDate(1000L).build(); |
| 136 | + |
| 137 | + FeatureFlag marked = source.markedAsOverride(); |
| 138 | + |
| 139 | + assertTrue(marked.isOverride()); |
| 140 | + assertFalse(source.isOverride()); |
| 141 | + assertNotSame(source, marked); |
| 142 | + assertEquals(source.getKey(), marked.getKey()); |
| 143 | + assertEquals(source.getVersion(), marked.getVersion()); |
| 144 | + assertEquals(source.isOn(), marked.isOn()); |
| 145 | + assertSame(source.getVariations(), marked.getVariations()); |
| 146 | + assertSame(source.getPrerequisites(), marked.getPrerequisites()); |
| 147 | + assertSame(source.getFallthrough(), marked.getFallthrough()); |
| 148 | + assertEquals(source.getOffVariation(), marked.getOffVariation()); |
| 149 | + assertEquals(source.isTrackEvents(), marked.isTrackEvents()); |
| 150 | + assertEquals(source.getDebugEventsUntilDate(), marked.getDebugEventsUntilDate()); |
| 151 | + assertSame(source.preprocessed, marked.preprocessed); |
| 152 | + } |
| 153 | + |
| 154 | + @Test |
| 155 | + public void markedFlagCopyOfUnpreprocessedFlagHasNoPreprocessing() { |
| 156 | + FeatureFlag source = flagBuilder("f").disablePreprocessing(true).build(); |
| 157 | + FeatureFlag marked = source.markedAsOverride(); |
| 158 | + assertNull(marked.preprocessed); |
| 159 | + assertNull(source.preprocessed); |
| 160 | + assertTrue(marked.isOverride()); |
| 161 | + } |
| 162 | + |
| 163 | + @Test |
| 164 | + public void markedSegmentCopyCarriesMarkerAndSharesDataWithoutMutatingSource() { |
| 165 | + Segment source = segmentBuilder("s").version(3).included("u1").excluded("u2").unbounded(false).build(); |
| 166 | + |
| 167 | + Segment marked = source.markedAsOverride(); |
| 168 | + |
| 169 | + assertTrue(marked.isOverride()); |
| 170 | + assertFalse(source.isOverride()); |
| 171 | + assertNotSame(source, marked); |
| 172 | + assertEquals(source.getKey(), marked.getKey()); |
| 173 | + assertEquals(source.getVersion(), marked.getVersion()); |
| 174 | + assertSame(source.getIncluded(), marked.getIncluded()); |
| 175 | + assertSame(source.getExcluded(), marked.getExcluded()); |
| 176 | + assertSame(source.getRules(), marked.getRules()); |
| 177 | + } |
| 178 | + |
| 179 | + @Test |
| 180 | + public void overrideMarkerIsNeverSerialized() { |
| 181 | + FeatureFlag flag = flagBuilder("f").version(7).build().markedAsOverride(); |
| 182 | + String flagJson = DataModel.FEATURES.serialize(new ItemDescriptor(flag.getVersion(), flag)); |
| 183 | + assertFalse(flagJson.toLowerCase().contains("override")); |
| 184 | + assertEquals(LDValue.of("f"), LDValue.parse(flagJson).get("key")); |
| 185 | + |
| 186 | + Segment segment = segmentBuilder("s").version(3).build().markedAsOverride(); |
| 187 | + String segmentJson = DataModel.SEGMENTS.serialize(new ItemDescriptor(segment.getVersion(), segment)); |
| 188 | + assertFalse(segmentJson.toLowerCase().contains("override")); |
| 189 | + } |
| 190 | + |
| 191 | + @Test |
| 192 | + public void overrideMarkerInJsonIsIgnoredWhenDeserializing() { |
| 193 | + FeatureFlag flag = (FeatureFlag) DataModel.FEATURES.deserialize( |
| 194 | + "{\"key\":\"f\",\"version\":1,\"isOverride\":true}").getItem(); |
| 195 | + assertFalse(flag.isOverride()); |
| 196 | + Segment segment = (Segment) DataModel.SEGMENTS.deserialize( |
| 197 | + "{\"key\":\"s\",\"version\":1,\"isOverride\":true}").getItem(); |
| 198 | + assertFalse(segment.isOverride()); |
| 199 | + } |
111 | 200 | } |
0 commit comments