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