Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

387 řádky
15KB

  1. <!--#include file="../App/ViewModels/KitViewModels.asp"-->
  2. <!--#include file="../App/DAL/lib.DAL.asp"-->
  3. <!--#include file="../App/DomainModels/JurisdictionRepository.asp"-->
  4. <!--#include file="../App/DomainModels/KitRepository.asp"-->
  5. <!--#include file="../App/DomainModels/InkjetRecordsRepository.asp"-->
  6. <!--#include file="../App/DomainModels/PurpleEnvelopeReportHelper.asp"-->
  7. <%
  8. Class PurpleEnvelopeReport_Tests
  9. Private m_tempDbPath
  10. Public Sub Setup
  11. m_tempDbPath = CreateDisposableDatabaseCopy()
  12. UseDisposableDatabase m_tempDbPath
  13. End Sub
  14. Public Sub Teardown
  15. ResetDisposableDatabase
  16. End Sub
  17. Public Function TestCaseNames
  18. TestCaseNames = Array( _
  19. "Test_FormatElectionLabel_Returns_Mon_YYYY_For_Valid_Date", _
  20. "Test_FormatElectionLabel_Returns_Trimmed_Raw_Value_For_Invalid_Date", _
  21. "Test_SortPrecinctColorRows_Handles_Zero_Padded_And_Lettered_Precincts", _
  22. "Test_SortPrecinctBallotRangeRows_Preserves_Ranges_While_Sorting", _
  23. "Test_GetPrecinctBallotRangesByKitId_Uses_Seeded_Data", _
  24. "Test_UpdateColorForKit_Updates_All_Seeded_Rows_For_The_Target_Kit", _
  25. "Test_UpdateColorForPrecinct_Updates_Only_The_Targeted_Precinct", _
  26. "Test_SwitchBoardPurpleEnvelopeEditFindById_Returns_Seeded_Header_Data", _
  27. "Test_KitController_Post_Actions_Still_Delegate_To_Color_Update_Repositories", _
  28. "Test_Report_View_Keeps_Print_Only_CSS_Contract", _
  29. "Test_Report_View_Keeps_No_Data_Row_And_Page_Spacer" _
  30. )
  31. End Function
  32. Private Sub Destroy(ByRef o)
  33. On Error Resume Next
  34. o.Close
  35. On Error GoTo 0
  36. Set o = Nothing
  37. End Sub
  38. Private Function CreatePrecinctColorRecordset(ByVal rows)
  39. dim rs : set rs = Server.CreateObject("ADODB.Recordset")
  40. With rs.Fields
  41. .Append "PRECINCT", adVarChar, 50
  42. .Append "ColorId", adVarChar, 50
  43. End With
  44. rs.Open
  45. dim i
  46. For i = 0 To UBound(rows)
  47. rs.AddNew
  48. rs("PRECINCT") = rows(i)(0)
  49. If IsNull(rows(i)(1)) Then
  50. rs("ColorId") = Null
  51. Else
  52. rs("ColorId") = rows(i)(1)
  53. End If
  54. rs.Update
  55. Next
  56. rs.MoveFirst
  57. set CreatePrecinctColorRecordset = rs
  58. End Function
  59. Private Function CreateBallotRangeRecordset(ByVal rows)
  60. dim rs : set rs = Server.CreateObject("ADODB.Recordset")
  61. With rs.Fields
  62. .Append "PRECINCT", adVarChar, 50
  63. .Append "LowBallotNumber", adInteger
  64. .Append "HighBallotNumber", adInteger
  65. End With
  66. rs.Open
  67. dim i
  68. For i = 0 To UBound(rows)
  69. rs.AddNew
  70. rs("PRECINCT") = rows(i)(0)
  71. rs("LowBallotNumber") = rows(i)(1)
  72. rs("HighBallotNumber") = rows(i)(2)
  73. rs.Update
  74. Next
  75. rs.MoveFirst
  76. set CreateBallotRangeRecordset = rs
  77. End Function
  78. Private Function PrecinctListToCsv(ByVal list)
  79. dim values()
  80. dim idx : idx = -1
  81. dim it : set it = list.Iterator()
  82. dim row
  83. Do While it.HasNext
  84. set row = it.GetNext()
  85. idx = idx + 1
  86. ReDim Preserve values(idx)
  87. values(idx) = row.PRECINCT
  88. Loop
  89. If idx = -1 Then
  90. PrecinctListToCsv = ""
  91. Else
  92. PrecinctListToCsv = Join(values, ",")
  93. End If
  94. End Function
  95. Private Function ReadAllText(ByVal relativePath)
  96. dim fso : set fso = Server.CreateObject("Scripting.FileSystemObject")
  97. dim fileHandle : set fileHandle = fso.OpenTextFile(Server.MapPath(relativePath), 1, False)
  98. ReadAllText = fileHandle.ReadAll()
  99. fileHandle.Close
  100. Set fileHandle = Nothing
  101. Set fso = Nothing
  102. End Function
  103. Private Function CreateDisposableDatabaseCopy()
  104. dim fso : set fso = Server.CreateObject("Scripting.FileSystemObject")
  105. dim tempFolderPath : tempFolderPath = Server.MapPath("Temp")
  106. If Not fso.FolderExists(tempFolderPath) Then
  107. fso.CreateFolder tempFolderPath
  108. End If
  109. dim sourcePath : sourcePath = Server.MapPath("../Data/webdata - Copy.mdb")
  110. dim guidValue : guidValue = Mid(CreateObject("Scriptlet.TypeLib").Guid, 2, 36)
  111. guidValue = Replace(guidValue, "-", "")
  112. CreateDisposableDatabaseCopy = tempFolderPath & "\purple-envelope-tests-" & guidValue & ".mdb"
  113. fso.CopyFile sourcePath, CreateDisposableDatabaseCopy, True
  114. Set fso = Nothing
  115. End Function
  116. Private Sub UseDisposableDatabase(ByVal dbPath)
  117. Set DAL__Singleton = Nothing
  118. set DAL__Singleton = new Database_Class
  119. DAL__Singleton.Initialize "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=5;Data Source=" & dbPath & ";"
  120. End Sub
  121. Private Sub ResetDisposableDatabase()
  122. dim tempPath : tempPath = m_tempDbPath
  123. Set DAL__Singleton = Nothing
  124. If Len(tempPath) > 0 Then
  125. dim fso : set fso = Server.CreateObject("Scripting.FileSystemObject")
  126. If fso.FileExists(tempPath) Then
  127. fso.DeleteFile tempPath, True
  128. End If
  129. Set fso = Nothing
  130. End If
  131. m_tempDbPath = ""
  132. End Sub
  133. Private Function NextSeedKey(ByVal prefix)
  134. NextSeedKey = prefix & Replace(Replace(Replace(CStr(Now()), "/", ""), ":", ""), " ", "") & CStr(Int((Rnd() * 1000000) + 1))
  135. End Function
  136. Private Function NextJurisdictionCode()
  137. dim guidValue : guidValue = Mid(CreateObject("Scriptlet.TypeLib").Guid, 2, 8)
  138. NextJurisdictionCode = "J" & Replace(guidValue, "-", "")
  139. End Function
  140. Private Function SeedJurisdiction(ByVal jCode, ByVal name)
  141. DAL.Execute "INSERT INTO [Jurisdiction] ([JCode], [Name], [Mailing_Address], [CSZ], [IMB], [IMB_Digits]) VALUES (?,?,?,?,?,?)", _
  142. Array(jCode, name, "123 Test St", "Lansing, MI 48933", "IMB", "123456789")
  143. SeedJurisdiction = jCode
  144. End Function
  145. Private Function SeedPurpleEnvelopeKit(ByVal jobNumber, ByVal jCode, ByVal status)
  146. DAL.Execute "INSERT INTO [Kit] ([JobNumber], [Jcode], [CreatedOn], [InkJetJob], [JobType], [Cass], [Status], [OutboundSTID], [InboundSTID], [OfficeCopiesAmount]) VALUES (?,?,?,?,?,?,?,?,?,?)", _
  147. Array(jobNumber, jCode, Now(), False, "Purple Envelopes", False, status, "", "", Null)
  148. SeedPurpleEnvelopeKit = QueryScalar("SELECT TOP 1 [ID] FROM [Kit] WHERE [JobNumber] = ? ORDER BY [ID] DESC", jobNumber)
  149. End Function
  150. Private Sub SeedInkjetRecord(ByVal kitId, ByVal precinct, ByVal ballotNumber, ByVal colorId)
  151. DAL.Execute "INSERT INTO [InkjetRecords] ([KitID], [PRECINCT], [BALLOT_NUMBER], [ColorId]) VALUES (?,?,?,?)", _
  152. Array(kitId, precinct, ballotNumber, colorId)
  153. End Sub
  154. Private Function QueryScalar(ByVal sql, ByVal params)
  155. dim rs : set rs = DAL.Query(sql, params)
  156. QueryScalar = rs(0).Value
  157. Destroy rs
  158. End Function
  159. Private Function QueryPrecinctColorMap(ByVal kitId)
  160. dim map : set map = Server.CreateObject("Scripting.Dictionary")
  161. dim rs : set rs = DAL.Query("SELECT [PRECINCT], [ColorId] FROM [InkjetRecords] WHERE [KitID] = ? ORDER BY [PRECINCT]", kitId)
  162. Do Until rs.EOF
  163. If IsNull(rs("ColorId")) Then
  164. map(rs("PRECINCT") & "") = ""
  165. Else
  166. map(rs("PRECINCT") & "") = CStr(rs("ColorId"))
  167. End If
  168. rs.MoveNext
  169. Loop
  170. Destroy rs
  171. set QueryPrecinctColorMap = map
  172. End Function
  173. Public Sub Test_FormatElectionLabel_Returns_Mon_YYYY_For_Valid_Date(T)
  174. T.AssertEqual "May-2026", PurpleEnvelopeReportHelper().FormatElectionLabel("5/26/2026"), "Expected valid dates to render as Mon-YYYY."
  175. End Sub
  176. Public Sub Test_FormatElectionLabel_Returns_Trimmed_Raw_Value_For_Invalid_Date(T)
  177. T.AssertEqual "not a date", PurpleEnvelopeReportHelper().FormatElectionLabel(" not a date "), "Expected invalid election dates to fall back to trimmed raw text."
  178. T.AssertEqual "", PurpleEnvelopeReportHelper().FormatElectionLabel(""), "Expected empty election dates to stay empty."
  179. End Sub
  180. Public Sub Test_SortPrecinctColorRows_Handles_Zero_Padded_And_Lettered_Precincts(T)
  181. dim rs : set rs = CreatePrecinctColorRecordset(Array( _
  182. Array("12B", "2"), _
  183. Array("0003", ""), _
  184. Array("A1", "4"), _
  185. Array("12A", "3"), _
  186. Array("3", "5"), _
  187. Array("0001", "1"), _
  188. Array("12", "6") _
  189. ))
  190. dim sorted : set sorted = PurpleEnvelopeReportHelper().SortPrecinctColorRows(rs)
  191. T.AssertEqual "0001,0003,3,12,12A,12B,A1", PrecinctListToCsv(sorted), "Expected mixed-format precincts to sort in the current ascending order."
  192. Destroy rs
  193. Destroy sorted
  194. End Sub
  195. Public Sub Test_SortPrecinctBallotRangeRows_Preserves_Ranges_While_Sorting(T)
  196. dim rs : set rs = CreateBallotRangeRecordset(Array( _
  197. Array("12A", 20, 29), _
  198. Array("0003", 1, 10), _
  199. Array("12", 11, 19), _
  200. Array("A1", 30, 39) _
  201. ))
  202. dim sorted : set sorted = PurpleEnvelopeReportHelper().SortPrecinctBallotRangeRows(rs)
  203. dim it : set it = sorted.Iterator()
  204. dim row
  205. T.AssertEqual "0003,12,12A,A1", PrecinctListToCsv(sorted), "Expected report rows to follow the same precinct order as the color table."
  206. set row = it.GetNext()
  207. T.AssertEqual 1, row.LowBallotNumber, "Expected the low ballot number to stay attached to precinct 0003."
  208. T.AssertEqual 10, row.HighBallotNumber, "Expected the high ballot number to stay attached to precinct 0003."
  209. Destroy rs
  210. Destroy sorted
  211. End Sub
  212. Public Sub Test_GetPrecinctBallotRangesByKitId_Uses_Seeded_Data(T)
  213. Randomize
  214. dim jCode : jCode = NextJurisdictionCode()
  215. dim jobNumber : jobNumber = NextSeedKey("JOB")
  216. Call SeedJurisdiction(jCode, "City of Lansing")
  217. dim kitId : kitId = SeedPurpleEnvelopeKit(jobNumber, jCode, "Ready To Assign STIDS")
  218. SeedInkjetRecord kitId, "12A", "29", Null
  219. SeedInkjetRecord kitId, "0003", "10", Null
  220. SeedInkjetRecord kitId, "12A", "20", Null
  221. SeedInkjetRecord kitId, "0003", "1", Null
  222. SeedInkjetRecord kitId, "A1", "30", Null
  223. dim rs : set rs = InkjetRecordsRepository.GetPrecinctBallotRangesByKitId(kitId)
  224. dim sorted : set sorted = PurpleEnvelopeReportHelper().SortPrecinctBallotRangeRows(rs)
  225. dim it : set it = sorted.Iterator()
  226. dim firstRow, secondRow, thirdRow
  227. set firstRow = it.GetNext()
  228. set secondRow = it.GetNext()
  229. set thirdRow = it.GetNext()
  230. T.AssertEqual "0003,12A,A1", PrecinctListToCsv(sorted), "Expected seeded ballot ranges to sort in the current report order."
  231. T.AssertEqual 1, firstRow.LowBallotNumber, "Expected precinct 0003 to use the seeded minimum ballot number."
  232. T.AssertEqual 10, firstRow.HighBallotNumber, "Expected precinct 0003 to use the seeded maximum ballot number."
  233. T.AssertEqual 20, secondRow.LowBallotNumber, "Expected precinct 12A to use the seeded minimum ballot number."
  234. T.AssertEqual 29, secondRow.HighBallotNumber, "Expected precinct 12A to use the seeded maximum ballot number."
  235. T.AssertEqual 30, thirdRow.LowBallotNumber, "Expected single-row precincts to keep their ballot number as the low value."
  236. T.AssertEqual 30, thirdRow.HighBallotNumber, "Expected single-row precincts to keep their ballot number as the high value."
  237. Destroy rs
  238. Destroy sorted
  239. Set firstRow = Nothing
  240. Set secondRow = Nothing
  241. Set thirdRow = Nothing
  242. End Sub
  243. Public Sub Test_UpdateColorForKit_Updates_All_Seeded_Rows_For_The_Target_Kit(T)
  244. Randomize
  245. dim jCode : jCode = NextJurisdictionCode()
  246. Call SeedJurisdiction(jCode, "City of Lansing")
  247. dim targetKitId : targetKitId = SeedPurpleEnvelopeKit(NextSeedKey("JOB"), jCode, "Ready To Assign STIDS")
  248. dim otherKitId : otherKitId = SeedPurpleEnvelopeKit(NextSeedKey("JOB"), jCode, "Ready To Assign STIDS")
  249. SeedInkjetRecord targetKitId, "0003", "1", 1
  250. SeedInkjetRecord targetKitId, "12A", "2", Null
  251. SeedInkjetRecord otherKitId, "9", "3", 4
  252. InkjetRecordsRepository.UpdateColorForKit targetKitId, 7
  253. dim targetMap : set targetMap = QueryPrecinctColorMap(targetKitId)
  254. dim otherMap : set otherMap = QueryPrecinctColorMap(otherKitId)
  255. T.AssertEqual "7", targetMap("0003"), "Expected kit-wide color updates to touch every row in the targeted kit."
  256. T.AssertEqual "7", targetMap("12A"), "Expected kit-wide color updates to touch every row in the targeted kit."
  257. T.AssertEqual "4", otherMap("9"), "Expected kit-wide color updates to leave other kits unchanged."
  258. Set targetMap = Nothing
  259. Set otherMap = Nothing
  260. End Sub
  261. Public Sub Test_UpdateColorForPrecinct_Updates_Only_The_Targeted_Precinct(T)
  262. Randomize
  263. dim jCode : jCode = NextJurisdictionCode()
  264. Call SeedJurisdiction(jCode, "City of Lansing")
  265. dim kitId : kitId = SeedPurpleEnvelopeKit(NextSeedKey("JOB"), jCode, "Ready To Assign STIDS")
  266. SeedInkjetRecord kitId, "0003", "1", 1
  267. SeedInkjetRecord kitId, "12A", "2", 2
  268. SeedInkjetRecord kitId, "A1", "3", Null
  269. InkjetRecordsRepository.UpdateColorForPrecinct kitId, "12A", 9
  270. dim colorMap : set colorMap = QueryPrecinctColorMap(kitId)
  271. T.AssertEqual "1", colorMap("0003"), "Expected non-targeted precincts to keep their original color."
  272. T.AssertEqual "9", colorMap("12A"), "Expected the targeted precinct to receive the new color."
  273. T.AssertEqual "", colorMap("A1"), "Expected non-targeted blank colors to remain blank."
  274. Set colorMap = Nothing
  275. End Sub
  276. Public Sub Test_SwitchBoardPurpleEnvelopeEditFindById_Returns_Seeded_Header_Data(T)
  277. Randomize
  278. dim jCode : jCode = NextJurisdictionCode()
  279. dim jobNumber : jobNumber = NextSeedKey("JOB")
  280. Call SeedJurisdiction(jCode, "City of Lansing")
  281. dim kitId : kitId = SeedPurpleEnvelopeKit(jobNumber, jCode, "Ready To Assign STIDS")
  282. SeedInkjetRecord kitId, "0003", "1", Null
  283. SeedInkjetRecord kitId, "12A", "2", Null
  284. dim model : set model = KitRepository.SwitchBoardPurpleEnvelopeEditFindById(kitId)
  285. T.AssertEqual kitId, model.ID, "Expected the seeded purple-envelope kit to be returned."
  286. T.AssertEqual jobNumber, model.JobNumber, "Expected the seeded job number to be returned."
  287. T.AssertEqual jCode, model.JCode, "Expected the seeded jurisdiction code to be returned."
  288. T.AssertEqual "City of Lansing", model.Jurisdiction, "Expected the seeded jurisdiction name to be returned."
  289. T.AssertEqual 2, model.LabelCount, "Expected the seeded inkjet row count to flow into the label count."
  290. T.AssertEqual "Ready To Assign STIDS", model.Status, "Expected the seeded status to be returned."
  291. Set model = Nothing
  292. End Sub
  293. Public Sub Test_KitController_Post_Actions_Still_Delegate_To_Color_Update_Repositories(T)
  294. dim controllerSource : controllerSource = ReadAllText("../App/Controllers/Kit/KitController.asp")
  295. T.Assert InStr(controllerSource, "Public Sub AssignKitColorPost") > 0, "Expected the kit-wide color POST action to remain present."
  296. T.Assert InStr(controllerSource, "InkjetRecordsRepository.UpdateColorForKit CLng(ID), CLng(Request.Form(""KitColorId""))") > 0, "Expected AssignKitColorPost to keep delegating to the kit-wide color repository update."
  297. T.Assert InStr(controllerSource, "Public Sub AssignPrecinctColorsPost") > 0, "Expected the precinct color POST action to remain present."
  298. T.Assert InStr(controllerSource, "InkjetRecordsRepository.UpdateColorForPrecinct CLng(ID), precinct, CLng(colorId)") > 0, "Expected AssignPrecinctColorsPost to keep delegating to the precinct-specific color repository update."
  299. End Sub
  300. Public Sub Test_Report_View_Keeps_Print_Only_CSS_Contract(T)
  301. dim viewSource : viewSource = ReadAllText("../App/Views/Kit/SwitchBoardPurpleEnvelopeEdit.asp")
  302. T.Assert InStr(viewSource, "id=""purple-envelope-report-print""") > 0, "Expected the report print wrapper id to remain in the view."
  303. T.Assert InStr(viewSource, "body * {") > 0, "Expected print CSS to hide non-report content."
  304. T.Assert InStr(viewSource, "font-size: 10pt;") > 0, "Expected the reduced report font size to remain unchanged."
  305. T.Assert InStr(viewSource, "padding: 0.45in 0.25in 0.25in 0.25in;") > 0, "Expected the print top buffer padding to remain unchanged."
  306. End Sub
  307. Public Sub Test_Report_View_Keeps_No_Data_Row_And_Page_Spacer(T)
  308. dim viewSource : viewSource = ReadAllText("../App/Views/Kit/SwitchBoardPurpleEnvelopeEdit.asp")
  309. T.Assert InStr(viewSource, "class=""print-page-spacer""") > 0, "Expected the repeated-page spacer row to remain in the report header."
  310. T.Assert InStr(viewSource, "No precinct ballot data found for this kit.") > 0, "Expected the empty-state report message to remain unchanged."
  311. End Sub
  312. End Class
  313. %>

Powered by TurnKey Linux.