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 		&lt;p&gt;Escape me!&lt;/p&gt;
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 		&lt;p&gt;Do escape&lt;/p&gt;
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 		&lt;div&gt;escaped header&lt;/div&gt;
98 		<div>header div</div>
99 		header
100 		<span>partial</span>
101 		&lt;p&gt;Escaped paragraph in partial&lt;/p&gt;
102 		footer
103 		<div>footer div</div>
104 	`));
105 }