1 module temple.tests.vibe; 2 3 /** 4 * Tests here depend on vibe.d's HTTPServer{Request,Response} being nonfinal 5 * in order to mock methods on them. However, this would require a modification 6 * to the vibe.d library, so by default they're disabled. 7 */ 8 version(none): 9 version(Have_vibe_d): 10 11 private { 12 import temple.tests.common; 13 import vibe.http.server; 14 import vibe.core.stream; 15 import core.time; 16 } 17 18 /* 19 * Stub of ConnectionStream to satisfy HTTPServerResponse 20 */ 21 private final class NullConnStream : ConnectionStream { 22 /// InputStream 23 @property bool empty() { return true; } 24 @property ulong leastSize() { return 0; } 25 @property bool dataAvailableForRead() { return false; }; 26 const(ubyte)[] peek() { return []; }; 27 void read(ubyte[] dst) {}; 28 29 /// OutputStream 30 void write(in ubyte[] bytes) {} 31 void flush() {} 32 void finalize() {} 33 void write(InputStream stream, ulong nbytes = 0) {}; 34 35 // ConnectionStream 36 @property bool connected() const { return false; } 37 void close() {} 38 bool waitForData(Duration timeout = 0.seconds) { return false; } 39 } 40 41 /* 42 * Stub of HTTPServerResponse to override bodyWriter 43 */ 44 private final class DummyHTTPServerResponse : HTTPServerResponse { 45 private: 46 AppenderOutputStream appender; 47 48 public: 49 this() { 50 super( 51 new NullConnStream(), 52 new NullConnStream(), 53 null, null); 54 appender = new AppenderOutputStream(); 55 } 56 57 override @property OutputStream bodyWriter() { 58 return appender; 59 } 60 61 string rendered() { 62 return appender.data(); 63 } 64 } 65 66 unittest { 67 auto resp = new DummyHTTPServerResponse(); 68 resp.renderTemple!` 69 Something here 70 <p>Something more here</p> 71 <%= "<p>Escape me!</p>" %> 72 `; 73 74 assert(isSameRender(resp.rendered, ` 75 Something here 76 <p>Something more here</p> 77 <p>Escape me!</p> 78 `)); 79 } 80 81 unittest { 82 auto resp = new DummyHTTPServerResponse(); 83 resp.renderTempleFile!"test12_vibe1.emd"; 84 85 assert(isSameRender(resp.rendered, ` 86 Rendering with renderTempleFile in temple.vibe 87 <p>Don't escape</p> 88 <p>Do escape</p> 89 `)); 90 } 91 92 unittest { 93 auto resp = new DummyHTTPServerResponse(); 94 resp.renderTempleLayoutFile!("test13_vibelayout.emd", "test13_vibepartial.emd"); 95 96 assert(isSameRender(resp.rendered, ` 97 <div>escaped header</div> 98 <div>header div</div> 99 header 100 <span>partial</span> 101 <p>Escaped paragraph in partial</p> 102 footer 103 <div>footer div</div> 104 `)); 105 }