001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.juneau.rest.assertions; 018 019import java.io.*; 020import java.lang.reflect.*; 021import java.util.*; 022import java.util.function.*; 023import java.util.regex.*; 024 025import org.apache.juneau.assertions.*; 026import org.apache.juneau.http.response.*; 027import org.apache.juneau.internal.*; 028import org.apache.juneau.rest.httppart.*; 029import org.apache.juneau.serializer.*; 030 031/** 032 * Used for fluent assertion calls against {@link RequestHeader} objects. 033 * 034 * <h5 class='topic'>Test Methods</h5> 035 * <p> 036 * <ul class='javatree'> 037 * <li class='jc'>{@link FluentStringAssertion} 038 * <ul class='javatreec'> 039 * <li class='jm'>{@link FluentStringAssertion#is(String) is(String)} 040 * <li class='jm'>{@link FluentStringAssertion#isNot(String) isNot(String)} 041 * <li class='jm'>{@link FluentStringAssertion#isLines(String...) isLines(String...)} 042 * <li class='jm'>{@link FluentStringAssertion#isSortedLines(String...) isSortedLines(String...)} 043 * <li class='jm'>{@link FluentStringAssertion#isIc(String) isIc(String)} 044 * <li class='jm'>{@link FluentStringAssertion#isNotIc(String) isNotIc(String)} 045 * <li class='jm'>{@link FluentStringAssertion#isContains(String...) isContains(String...)} 046 * <li class='jm'>{@link FluentStringAssertion#isNotContains(String...) isNotContains(String...)} 047 * <li class='jm'>{@link FluentStringAssertion#isEmpty() isEmpty()} 048 * <li class='jm'>{@link FluentStringAssertion#isNotEmpty() isNotEmpty()} 049 * <li class='jm'>{@link FluentStringAssertion#isString(Object) isString(Object)} 050 * <li class='jm'>{@link FluentStringAssertion#isMatches(String) isMatches(String)} 051 * <li class='jm'>{@link FluentStringAssertion#isPattern(String) isPattern(String)} 052 * <li class='jm'>{@link FluentStringAssertion#isPattern(String,int) isPattern(String,int)} 053 * <li class='jm'>{@link FluentStringAssertion#isPattern(Pattern) isPattern(Pattern)} 054 * <li class='jm'>{@link FluentStringAssertion#isStartsWith(String) isStartsWith(String)} 055 * <li class='jm'>{@link FluentStringAssertion#isEndsWith(String) isEndsWith(String)} 056 * </ul> 057 * <li class='jc'>{@link FluentObjectAssertion} 058 * <ul class='javatreec'> 059 * <li class='jm'>{@link FluentObjectAssertion#isExists() isExists()} 060 * <li class='jm'>{@link FluentObjectAssertion#is(Object) is(Object)} 061 * <li class='jm'>{@link FluentObjectAssertion#is(Predicate) is(Predicate)} 062 * <li class='jm'>{@link FluentObjectAssertion#isNot(Object) isNot(Object)} 063 * <li class='jm'>{@link FluentObjectAssertion#isAny(Object...) isAny(Object...)} 064 * <li class='jm'>{@link FluentObjectAssertion#isNotAny(Object...) isNotAny(Object...)} 065 * <li class='jm'>{@link FluentObjectAssertion#isNull() isNull()} 066 * <li class='jm'>{@link FluentObjectAssertion#isNotNull() isNotNull()} 067 * <li class='jm'>{@link FluentObjectAssertion#isString(String) isString(String)} 068 * <li class='jm'>{@link FluentObjectAssertion#isJson(String) isJson(String)} 069 * <li class='jm'>{@link FluentObjectAssertion#isSame(Object) isSame(Object)} 070 * <li class='jm'>{@link FluentObjectAssertion#isSameJsonAs(Object) isSameJsonAs(Object)} 071 * <li class='jm'>{@link FluentObjectAssertion#isSameSortedJsonAs(Object) isSameSortedJsonAs(Object)} 072 * <li class='jm'>{@link FluentObjectAssertion#isSameSerializedAs(Object, WriterSerializer) isSameSerializedAs(Object, WriterSerializer)} 073 * <li class='jm'>{@link FluentObjectAssertion#isType(Class) isType(Class)} 074 * <li class='jm'>{@link FluentObjectAssertion#isExactType(Class) isExactType(Class)} 075 * </ul> 076 * </ul> 077 * 078 * <h5 class='topic'>Transform Methods</h5> 079 * <p> 080 * <ul class='javatree'> 081 * <li class='jc'>{@link FluentRequestHeaderAssertion} 082 * <ul class='javatreec'> 083 * <li class='jm'>{@link FluentRequestHeaderAssertion#asBoolean() asBoolean()} 084 * <li class='jm'>{@link FluentRequestHeaderAssertion#asInteger() asInteger()} 085 * <li class='jm'>{@link FluentRequestHeaderAssertion#asLong() asLong()} 086 * <li class='jm'>{@link FluentRequestHeaderAssertion#asZonedDateTime() asZonedDateTime()} 087 * <li class='jm'>{@link FluentRequestHeaderAssertion#as(Class) as(Class)} 088 * </ul> 089 * <li class='jc'>{@link FluentStringAssertion} 090 * <ul class='javatreec'> 091 * <li class='jm'>{@link FluentStringAssertion#asReplaceAll(String,String) asReplaceAll(String,String)} 092 * <li class='jm'>{@link FluentStringAssertion#asReplace(String,String) asReplace(String,String)} 093 * <li class='jm'>{@link FluentStringAssertion#asUrlDecode() asUrlDecode()} 094 * <li class='jm'>{@link FluentStringAssertion#asLc() asLc()} 095 * <li class='jm'>{@link FluentStringAssertion#asUc() asUc()} 096 * <li class='jm'>{@link FluentStringAssertion#asLines() asLines()} 097 * <li class='jm'>{@link FluentStringAssertion#asSplit(String) asSplit(String)} 098 * <li class='jm'>{@link FluentStringAssertion#asLength() asLength()} 099 * <li class='jm'>{@link FluentStringAssertion#asOneLine() asOneLine()} 100 * </ul> 101 * <li class='jc'>{@link FluentObjectAssertion} 102 * <ul class='javatreec'> 103 * <li class='jm'>{@link FluentObjectAssertion#asString() asString()} 104 * <li class='jm'>{@link FluentObjectAssertion#asString(WriterSerializer) asString(WriterSerializer)} 105 * <li class='jm'>{@link FluentObjectAssertion#asString(Function) asString(Function)} 106 * <li class='jm'>{@link FluentObjectAssertion#asJson() asJson()} 107 * <li class='jm'>{@link FluentObjectAssertion#asJsonSorted() asJsonSorted()} 108 * <li class='jm'>{@link FluentObjectAssertion#asTransformed(Function) asApplied(Function)} 109 * <li class='jm'>{@link FluentObjectAssertion#asAny() asAny()} 110 * </ul> 111 * </ul> 112 * 113 * <h5 class='topic'>Configuration Methods</h5> 114 * <p> 115 * <ul class='javatree'> 116 * <li class='jc'>{@link Assertion} 117 * <ul class='javatreec'> 118 * <li class='jm'>{@link Assertion#setMsg(String, Object...) setMsg(String, Object...)} 119 * <li class='jm'>{@link Assertion#setOut(PrintStream) setOut(PrintStream)} 120 * <li class='jm'>{@link Assertion#setSilent() setSilent()} 121 * <li class='jm'>{@link Assertion#setStdOut() setStdOut()} 122 * <li class='jm'>{@link Assertion#setThrowable(Class) setThrowable(Class)} 123 * </ul> 124 * </ul> 125 * 126 * <h5 class='section'>See Also:</h5><ul> 127 * <li class='link'><a class="doclink" href="https://juneau.apache.org/docs/topics/JuneauEcosystemOverview">Juneau Ecosystem Overview</a> 128 * </ul> 129 * 130 * @param <R> The return type. 131 */ 132public class FluentRequestHeaderAssertion <R> extends FluentStringAssertion<R> { 133 134 private final RequestHeader value; 135 136 //----------------------------------------------------------------------------------------------------------------- 137 // Constructors 138 //----------------------------------------------------------------------------------------------------------------- 139 140 /** 141 * Constructor. 142 * 143 * @param value 144 * The object being tested. 145 * <br>Can be <jk>null</jk>. 146 * @param returns 147 * The object to return after a test method is called. 148 * <br>If <jk>null</jk>, the test method returns this object allowing multiple test method calls to be 149 * used on the same assertion. 150 */ 151 public FluentRequestHeaderAssertion(RequestHeader value, R returns) { 152 this(null, value, returns); 153 } 154 155 /** 156 * Chained constructor. 157 * 158 * <p> 159 * Used when transforming one assertion into another so that the assertion config can be used by the new assertion. 160 * 161 * @param creator 162 * The assertion that created this assertion. 163 * <br>Should be <jk>null</jk> if this is the top-level assertion. 164 * @param value 165 * The object being tested. 166 * <br>Can be <jk>null</jk>. 167 * @param returns 168 * The object to return after a test method is called. 169 * <br>If <jk>null</jk>, the test method returns this object allowing multiple test method calls to be 170 * used on the same assertion. 171 */ 172 public FluentRequestHeaderAssertion(Assertion creator, RequestHeader value, R returns) { 173 super(null, value.asString().orElse(null), returns); 174 this.value = value; 175 setThrowable(BadRequest.class); 176 } 177 178 //----------------------------------------------------------------------------------------------------------------- 179 // Transform methods 180 //----------------------------------------------------------------------------------------------------------------- 181 182 /** 183 * Converts this object assertion into a boolean assertion. 184 * 185 * @return A new assertion. 186 * @throws AssertionError If object is not a boolean. 187 */ 188 public FluentBooleanAssertion<R> asBoolean() { 189 return new FluentBooleanAssertion<>(this, value.asBoolean().orElse(null), returns()); 190 } 191 192 /** 193 * Converts this object assertion into an integer assertion. 194 * 195 * @return A new assertion. 196 * @throws AssertionError If object is not an integer. 197 */ 198 public FluentIntegerAssertion<R> asInteger() { 199 return new FluentIntegerAssertion<>(this, value.asInteger().orElse(null), returns()); 200 } 201 202 /** 203 * Converts this object assertion into a long assertion. 204 * 205 * @return A new assertion. 206 * @throws AssertionError If object is not a long. 207 */ 208 public FluentLongAssertion<R> asLong() { 209 return new FluentLongAssertion<>(this, value.asLong().orElse(null), returns()); 210 } 211 212 /** 213 * Converts this object assertion into a zoned-datetime assertion. 214 * 215 * @return A new assertion. 216 * @throws AssertionError If object is not a zoned-datetime. 217 */ 218 public FluentZonedDateTimeAssertion<R> asZonedDateTime() { 219 return new FluentZonedDateTimeAssertion<>(this, value.asDateHeader().asZonedDateTime().orElse(null), returns()); 220 } 221 222 /** 223 * Converts the parameter value to a type using {@link RequestHeader#as(Class)} and then returns the value as an any-object assertion. 224 * 225 * @param <T> The object type to create. 226 * @param type The object type to create. 227 * @return A new fluent assertion object. 228 */ 229 public <T> FluentAnyAssertion<T,R> as(Class<T> type) { 230 return new FluentAnyAssertion<>(value.as(type).orElse(null), returns()); 231 } 232 233 /** 234 * Converts the parameter value to a type using {@link RequestHeader#as(Type,Type...)} and then returns the value as an any-object assertion. 235 * 236 * <p> 237 * See <a class="doclink" href="https://juneau.apache.org/docs/topics/ComplexDataTypes">Complex Data Types</a> for information on defining complex generic types of {@link Map Maps} and {@link Collection Collections}. 238 * 239 * @param type The object type to create. 240 * @param args Optional type arguments. 241 * @return A new fluent assertion object. 242 */ 243 public FluentAnyAssertion<Object,R> as(Type type, Type...args) { 244 return new FluentAnyAssertion<>(value.as(type, args).orElse(null), returns()); 245 } 246 247 //----------------------------------------------------------------------------------------------------------------- 248 // Fluent setters 249 //----------------------------------------------------------------------------------------------------------------- 250 @Override /* Overridden from Assertion */ 251 public FluentRequestHeaderAssertion<R> setMsg(String msg, Object...args) { 252 super.setMsg(msg, args); 253 return this; 254 } 255 256 @Override /* Overridden from Assertion */ 257 public FluentRequestHeaderAssertion<R> setOut(PrintStream value) { 258 super.setOut(value); 259 return this; 260 } 261 262 @Override /* Overridden from Assertion */ 263 public FluentRequestHeaderAssertion<R> setSilent() { 264 super.setSilent(); 265 return this; 266 } 267 268 @Override /* Overridden from Assertion */ 269 public FluentRequestHeaderAssertion<R> setStdOut() { 270 super.setStdOut(); 271 return this; 272 } 273 274 @Override /* Overridden from Assertion */ 275 public FluentRequestHeaderAssertion<R> setThrowable(Class<? extends java.lang.RuntimeException> value) { 276 super.setThrowable(value); 277 return this; 278 } 279 280 @Override /* Overridden from FluentStringAssertion */ 281 public FluentRequestHeaderAssertion<R> asJavaStrings() { 282 super.asJavaStrings(); 283 return this; 284 } 285}