Skip to content

Commit a2222f9

Browse files
committed
Add test support code that allows capturing output snapshots & an example.
A large surface area of code exists that generates e.g. HTML output. Much of this is not built upon names types and there is often no easily usable seam that exists for capturing this structure and/or supplying a fixture. This change lays some groundwork that is intended to allow such code to be refactored going forward without the fear of introducing regressions. Roughly, the idea is to first write a test which captures the output as-is given suitable inputs. The snapshotting code will do this automatically on first invocation. These can then be checked in as test-only changes. Once such a test is in-place future execution of the test will assert that the output generated matches the previously saved snapshot. Snapshots can be refreshed either by deleting their corresponding on-disk file or specifying true, yes or 1 for the REFRESH_SNAPHOTS env variable.
1 parent 73748c6 commit a2222f9

File tree

3 files changed

+465
-3
lines changed

3 files changed

+465
-3
lines changed
Lines changed: 341 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,341 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
5+
<meta name="viewport" content="width=device-width, initial-scale=1">
6+
7+
<!-- page specific meta tags -->
8+
9+
10+
<!-- site default style -->
11+
<link rel="stylesheet" type="text/css" href="/images/default.css" media="screen"/>
12+
13+
<!-- base page styles -->
14+
15+
16+
17+
<!-- specific page styles -->
18+
19+
20+
21+
<!-- skin page styles -->
22+
23+
24+
25+
<!-- append any site-specific styles -->
26+
<link rel="stylesheet" type="text/css" href="/images/site-custom.css" media="screen"/>
27+
28+
29+
30+
<!-- begin user supplied style dependencies -->
31+
32+
<!-- end user supplied style dependencies -->
33+
34+
35+
<!-- Set site favicon -->
36+
<link rel="icon" type="image/vnd.microsoft.icon" href="/images/skin/migrid-basic/favicon.ico"/>
37+
38+
39+
<!-- base page scripts -->
40+
41+
42+
43+
<!-- skin page scripts -->
44+
45+
46+
47+
<!-- specific page scripts -->
48+
49+
50+
51+
<!-- general script init and ready handlers -->
52+
<script type="text/javascript" >
53+
54+
$(document).ready(function() {
55+
//console.log("document ready handler");
56+
57+
});
58+
</script>
59+
60+
<!-- append any site-specific scripts -->
61+
62+
63+
<!-- begin user supplied script dependencies -->
64+
65+
<!-- end user supplied script dependencies -->
66+
67+
68+
69+
<title>
70+
TEST
71+
</title>
72+
73+
</head>
74+
75+
<body id="modern-ui-body" class=''>
76+
77+
<!-- Push notifications: updated/filled by AJAX -->
78+
<div id="sitestatus-popup" class="toast hidden" data-autohide="false">
79+
<div id="sitestatus-top" class="toast-header">
80+
<div id="sitestatus-title" class="toast-title">
81+
<!-- TODO: move inline style to css files -->
82+
<!-- NOTE: reuse 1.5rem size with ml-2 and mb-1 classes to mimic close -->
83+
<span id="sitestatus-icon" class="fas fa-question-circle ml-2 mb-1" style="color: grey; font-size: 1.5rem; float: left;"></span>
84+
<strong class="mr-auto text-primary" style="float: left;">
85+
<h3 id="sitestatus-caption" style="margin-left: 5px;">SITE STATUS</h3>
86+
</strong>
87+
<small id="sitestatus-timestamp" class="text-muted" style="float: right;"></small>
88+
</div>
89+
<div id="sitestatus-close" class="">
90+
<button type="button" class="ml-2 mb-1 close" data-dismiss="toast">&times;</button>
91+
</div>
92+
</div>
93+
<div id="sitestatus-content" class="toast-body">
94+
<h3>Site Status</h3>
95+
<p id="sitestatus-line" class="status-text">
96+
<!-- Filled by AJAX -->
97+
</p>
98+
<div id="sitestatus-recent" class="hidden"><h3>Active Announcements</h3>
99+
<p id="sitestatus-announce" class="announce-text"></p>
100+
</div>
101+
</div>
102+
<div id="sitestatus-more" class="toast-body">
103+
<a target=_blank href="/public/status.html">More details ...</a>
104+
</div>
105+
</div>
106+
107+
108+
<!--HEADER INFO AREA-->
109+
<nav id="headerNav">
110+
<ul class="nav__items">
111+
<li class="nav__item">
112+
<a id="supportInfoButton" href="#" class="nav__label" onclick="toggle_info('supportInfo')">Support</a>
113+
</li>
114+
<li class="nav__item nav_item--expanded">
115+
<a id="aboutInfoButton" href="#" class="nav__label" onclick="toggle_info('aboutInfo')">About</a>
116+
</li>
117+
<!-- NOTE: completely skip feedback button for now to avoid border
118+
<li id="sitefeedback-button" class="nav__item nav_item--expanded fas fa-thumbs-up custom-hidden"></li>
119+
-->
120+
121+
<li id="sitestatus-button" class="nav__item nav_item--expanded fas fa-question-circle custom-show" onclick="show_message()" title="Site status - click for details"></li>
122+
123+
</ul>
124+
</nav>
125+
126+
<div id="infoArea" class="infoArea-container">
127+
</div>
128+
129+
<div id="supportInfo" class="infoArea-container">
130+
<span class="far fa-times-circle close_btn" onclick="toggle_info('supportInfo')"></span>
131+
<div class="popup container">
132+
<div class="row">
133+
<!-- NOTE: we invert color coding scheme for FAQ accordion -->
134+
<div id="support-content" class="col-lg-12 invert-theme">
135+
<!-- Filled by AJAX -->
136+
</div>
137+
<div class="vertical-spacer"></div>
138+
</div>
139+
</div>
140+
</div>
141+
142+
<div id="aboutInfo" class="infoArea-container">
143+
<span class="far fa-times-circle close_btn" onclick="toggle_info('aboutInfo')"></span>
144+
<div class="popup container">
145+
<div class="row">
146+
<div id="about-content" class="col-lg-12">
147+
<!-- Filled by AJAX -->
148+
</div>
149+
<div class="vertical-spacer"></div>
150+
</div>
151+
</div>
152+
</div>
153+
154+
<!--New nav side bar -->
155+
<nav id="sideBar" >
156+
<!--SIDEBAR-->
157+
<div class="sidebar-container row">
158+
<div class="sidebar-header col-12 align-self-start">
159+
<a id="logoMenu" href="home.py">
160+
<div class="home-nav-logo"></div>
161+
</a>
162+
</div>
163+
164+
165+
166+
167+
<div class="sidebar-middle col-12 align-self-center">
168+
169+
<a href="home.py" class="link-home link-fas link-fa-home" title="App overview and launch page">
170+
<span class="home fas fa-home"></span></a>
171+
<a href="fileman.py" class="link-files link-fas link-fa-folder" title="Manage files and folders in your home directory">
172+
<span class="files fas fa-folder"></span></a>
173+
<a href="submitjob.py" class="link-submitjob link-fas link-fa-running" title="Submit a job for execution on a resource">
174+
<span class="submitjob fas fa-running"></span></a>
175+
<a href="jobman.py" class="link-jobs link-fas link-fa-tasks" title="Manage and monitor your grid jobs">
176+
<span class="jobs fas fa-tasks"></span></a>
177+
<a href="vgridman.py" class="link-vgrids link-fas link-fa-network-wired" title="Virtual organisations sharing some resources and files">
178+
<span class="vgrids fas fa-network-wired"></span></a>
179+
<a href="resman.py" class="link-resources link-fas link-fa-server" title="Resources available in the system">
180+
<span class="resources fas fa-server"></span></a>
181+
<a href="redb.py" class="link-runtimeenvs link-fas link-fa-warehouse" title="Runtime environments: software which can be made available">
182+
<span class="runtimeenvs fas fa-warehouse"></span></a>
183+
<a href="people.py" class="link-people link-fas link-fa-users" title="View and communicate with other users">
184+
<span class="people fas fa-users"></span></a>
185+
<!-- Skip built-in settings for modern UI -->
186+
<a href="downloads.py" class="link-downloads link-fas link-fa-download" title="Download scripts to work directly from your local machine">
187+
<span class="downloads fas fa-download"></span></a>
188+
<a href="datatransfer.py" class="link-transfers link-fas link-fa-datatransfer" title="For background batch transfers of data">
189+
<span class="transfers fas fa-datatransfer"></span></a>
190+
<a href="sharelink.py" class="link-sharelinks link-fas link-fa-share-alt" title="Manage share links for easy data exchange">
191+
<span class="sharelinks fas fa-share-alt"></span></a>
192+
<a href="crontab.py" class="link-crontab link-fas link-fa-calendar-check" title="Your personal task scheduler">
193+
<span class="crontab fas fa-calendar-check"></span></a>
194+
<a href="docs.py" class="link-docs link-fas link-fa-book" title="Some built-in documentation for reference">
195+
<span class="docs fas fa-book"></span></a>
196+
<!-- Skip built-in logout for modern UI -->
197+
198+
<div id="hamBtn" class="hamburger hamburger--vortex" onclick="hamburgerMenuToggle()">
199+
<div class="hamburger-box">
200+
<!--<div class="hamburger-inner"></div>-->
201+
<h3>...</h3>
202+
</div>
203+
<!--<div id="menuTxt">Menu</div>-->
204+
</div>
205+
206+
207+
208+
</div>
209+
<div class = "col-12 align-self-end home-nav-user__container" >
210+
<div id = "userMenuButton" class = "fas fa-user home-nav-user" onclick = "userMenuToggle()" title = "Your personal settings for MiG" > </div>
211+
</div>
212+
213+
214+
215+
216+
</div>
217+
</nav>
218+
219+
220+
<div id = "hamMenu" class = "slidernav-container" >
221+
222+
<div class = "slider-container__inner row" >
223+
<div class="slider-header col-12 align-self-start">
224+
<h2>MiG</h2>
225+
</div>
226+
<div class="slider-middle col-12 align-self-center">
227+
228+
<div class="navmenu slider-middle col-12 align-self-center">
229+
<a href="home.py" class="link-home link-fas link-fa-home" title="App overview and launch page">
230+
<span class="home fas fa-home hidden"></span>Home</a>
231+
<a href="fileman.py" class="link-files link-fas link-fa-folder" title="Manage files and folders in your home directory">
232+
<span class="files fas fa-folder hidden"></span>Files</a>
233+
<a href="submitjob.py" class="link-submitjob link-fas link-fa-running" title="Submit a job for execution on a resource">
234+
<span class="submitjob fas fa-running hidden"></span>Submit Job</a>
235+
<a href="jobman.py" class="link-jobs link-fas link-fa-tasks" title="Manage and monitor your grid jobs">
236+
<span class="jobs fas fa-tasks hidden"></span>Jobs</a>
237+
<a href="vgridman.py" class="link-vgrids link-fas link-fa-network-wired" title="Virtual organisations sharing some resources and files">
238+
<span class="vgrids fas fa-network-wired hidden"></span>VGrids</a>
239+
<a href="resman.py" class="link-resources link-fas link-fa-server" title="Resources available in the system">
240+
<span class="resources fas fa-server hidden"></span>Resources</a>
241+
<a href="redb.py" class="link-runtimeenvs link-fas link-fa-warehouse" title="Runtime environments: software which can be made available">
242+
<span class="runtimeenvs fas fa-warehouse hidden"></span>Runtime Envs</a>
243+
<a href="people.py" class="link-people link-fas link-fa-users" title="View and communicate with other users">
244+
<span class="people fas fa-users hidden"></span>People</a>
245+
<!-- Skip built-in settings for modern UI -->
246+
<a href="downloads.py" class="link-downloads link-fas link-fa-download" title="Download scripts to work directly from your local machine">
247+
<span class="downloads fas fa-download hidden"></span>Downloads</a>
248+
<a href="datatransfer.py" class="link-transfers link-fas link-fa-datatransfer" title="For background batch transfers of data">
249+
<span class="transfers fas fa-datatransfer hidden"></span>Data Transfers</a>
250+
<a href="sharelink.py" class="link-sharelinks link-fas link-fa-share-alt" title="Manage share links for easy data exchange">
251+
<span class="sharelinks fas fa-share-alt hidden"></span>Share Links</a>
252+
<a href="crontab.py" class="link-crontab link-fas link-fa-calendar-check" title="Your personal task scheduler">
253+
<span class="crontab fas fa-calendar-check hidden"></span>Schedule Tasks</a>
254+
<a href="docs.py" class="link-docs link-fas link-fa-book" title="Some built-in documentation for reference">
255+
<span class="docs fas fa-book hidden"></span>Docs</a>
256+
<!-- Skip built-in logout for modern UI -->
257+
258+
<div id="hamBtn" class="hamburger hamburger--vortex" onclick="hamburgerMenuToggle()">
259+
<div class="hamburger-box">
260+
<!--<div class="hamburger-inner"></div>-->
261+
<h3>...</h3>
262+
</div>
263+
<!--<div id="menuTxt">Menu</div>-->
264+
</div>
265+
266+
</div>
267+
268+
</div>
269+
<div class="slider-footer col-12 align-self-end home-nav-user__inner">
270+
<a onclick="userMenuToggle()">User</a>
271+
</div>
272+
</div>
273+
</div>
274+
275+
276+
277+
<!--USER ACCOUNT MENU POPUP - HIDDEN-->
278+
<div id="userMenu" class="popup-container row">
279+
<div class="popup-header col-12">
280+
<div class="row">
281+
<div class="col-3">
282+
<div class="user-avatar">
283+
284+
<span class="avatar-image anonymous"></span>
285+
286+
</div>
287+
</div>
288+
<div class="col-9">
289+
290+
<a class="user-menu__link avatar-link " href="settings.py">Change photo</a>
291+
</div>
292+
</div>
293+
</div>
294+
<div class="popup-middle col-12">
295+
<a class="user-menu__item link-home " href="home.py">Home</a>
296+
<a class="user-menu__item link-account disable-link" href="account.py">Account</a>
297+
<a class="user-menu__item link-settings " href="settings.py">Settings</a>
298+
<a class="user-menu__item link-setup disable-link" href="setup.py">Setup</a>
299+
<a class="user-menu__item link-help " href="https://sourceforge.net/p/migrid/wiki">Help</a>
300+
</div>
301+
<div class="popup-footer col-12">
302+
<a class="user-menu__item link-logout " href="logout.py">Sign Out</a>
303+
</div>
304+
</div>
305+
306+
307+
308+
<section id="globalContainer" class="global-container frame menu ">
309+
<div class="wallpaper "></div>
310+
311+
312+
<div id="migheader" class="">
313+
314+
</div>
315+
316+
317+
<div id="content" class="i18n " lang="en">
318+
319+
320+
<!-- Begin UI container -->
321+
<div class="container page-content ">
322+
323+
324+
<!-- End UI container -->
325+
</div>
326+
327+
328+
</div>
329+
330+
331+
<div id='exitcode'>
332+
<span class='spacer'></span>
333+
Exit code: 0 Description: OK (done in 0.000s)
334+
<span class='spacer'></span>
335+
</div>
336+
337+
</section>
338+
</body>
339+
340+
</html>
341+

0 commit comments

Comments
 (0)