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