PageRenderTime 36ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb

https://gitlab.com/abuhazim/gitlab-foss
Ruby | 474 lines | 386 code | 87 blank | 1 comment | 0 complexity | 459d0b536d5e8525441dd4d01d0bc2ac MD5 | raw file
  1. # frozen_string_literal: true
  2. require 'spec_helper'
  3. RSpec.describe Gitlab::Ci::Reports::TestSuiteComparer, :aggregate_failures do
  4. include TestReportsHelper
  5. let(:comparer) { described_class.new(name, base_suite, head_suite) }
  6. let(:name) { 'rspec' }
  7. let(:base_suite) { Gitlab::Ci::Reports::TestSuite.new(name) }
  8. let(:head_suite) { Gitlab::Ci::Reports::TestSuite.new(name) }
  9. let(:test_case_success) { create_test_case_java_success }
  10. let(:test_case_failed) { create_test_case_java_failed }
  11. let(:test_case_error) { create_test_case_java_error }
  12. describe '#new_failures' do
  13. subject { comparer.new_failures }
  14. context 'when head suite has a newly failed test case which does not exist in base' do
  15. before do
  16. base_suite.add_test_case(test_case_success)
  17. head_suite.add_test_case(test_case_failed)
  18. end
  19. it 'returns the failed test case' do
  20. is_expected.to eq([test_case_failed])
  21. end
  22. end
  23. context 'when head suite still has a failed test case which failed in base' do
  24. before do
  25. base_suite.add_test_case(test_case_failed)
  26. head_suite.add_test_case(test_case_failed)
  27. end
  28. it 'does not return the failed test case' do
  29. is_expected.to be_empty
  30. end
  31. end
  32. context 'when head suite has a success test case which failed in base' do
  33. before do
  34. base_suite.add_test_case(test_case_failed)
  35. head_suite.add_test_case(test_case_success)
  36. end
  37. it 'does not return the failed test case' do
  38. is_expected.to be_empty
  39. end
  40. end
  41. end
  42. describe '#existing_failures' do
  43. subject { comparer.existing_failures }
  44. context 'when head suite has a newly failed test case which does not exist in base' do
  45. before do
  46. base_suite.add_test_case(test_case_success)
  47. head_suite.add_test_case(test_case_failed)
  48. end
  49. it 'returns the failed test case' do
  50. is_expected.to be_empty
  51. end
  52. end
  53. context 'when head suite still has a failed test case which failed in base' do
  54. before do
  55. base_suite.add_test_case(test_case_failed)
  56. head_suite.add_test_case(test_case_failed)
  57. end
  58. it 'does not return the failed test case' do
  59. is_expected.to eq([test_case_failed])
  60. end
  61. end
  62. context 'when head suite has a success test case which failed in base' do
  63. before do
  64. base_suite.add_test_case(test_case_failed)
  65. head_suite.add_test_case(test_case_success)
  66. end
  67. it 'does not return the failed test case' do
  68. is_expected.to be_empty
  69. end
  70. end
  71. end
  72. describe '#resolved_failures' do
  73. subject { comparer.resolved_failures }
  74. context 'when head suite has a newly failed test case which does not exist in base' do
  75. before do
  76. base_suite.add_test_case(test_case_success)
  77. head_suite.add_test_case(test_case_failed)
  78. end
  79. it 'returns the failed test case' do
  80. is_expected.to be_empty
  81. end
  82. it 'returns the correct resolved count' do
  83. expect(comparer.resolved_count).to eq(0)
  84. end
  85. end
  86. context 'when head suite still has a failed test case which failed in base' do
  87. before do
  88. base_suite.add_test_case(test_case_failed)
  89. head_suite.add_test_case(test_case_failed)
  90. end
  91. it 'does not return the failed test case' do
  92. is_expected.to be_empty
  93. end
  94. it 'returns the correct resolved count' do
  95. expect(comparer.resolved_count).to eq(0)
  96. end
  97. end
  98. context 'when head suite has a success test case which failed in base' do
  99. before do
  100. base_suite.add_test_case(test_case_failed)
  101. head_suite.add_test_case(test_case_success)
  102. end
  103. it 'does not return the resolved test case' do
  104. is_expected.to eq([test_case_success])
  105. end
  106. it 'returns the correct resolved count' do
  107. expect(comparer.resolved_count).to eq(1)
  108. end
  109. end
  110. end
  111. describe '#new_errors' do
  112. subject { comparer.new_errors }
  113. context 'when head suite has a new error test case which does not exist in base' do
  114. before do
  115. base_suite.add_test_case(test_case_success)
  116. head_suite.add_test_case(test_case_error)
  117. end
  118. it 'returns the error test case' do
  119. is_expected.to eq([test_case_error])
  120. end
  121. end
  122. context 'when head suite still has an error test case which errored in base' do
  123. before do
  124. base_suite.add_test_case(test_case_error)
  125. head_suite.add_test_case(test_case_error)
  126. end
  127. it 'does not return the error test case' do
  128. is_expected.to be_empty
  129. end
  130. end
  131. context 'when head suite has a success test case which errored in base' do
  132. before do
  133. base_suite.add_test_case(test_case_error)
  134. head_suite.add_test_case(test_case_success)
  135. end
  136. it 'does not return the error test case' do
  137. is_expected.to be_empty
  138. end
  139. end
  140. end
  141. describe '#existing_errors' do
  142. subject { comparer.existing_errors }
  143. context 'when head suite has a new error test case which does not exist in base' do
  144. before do
  145. base_suite.add_test_case(test_case_success)
  146. head_suite.add_test_case(test_case_error)
  147. end
  148. it 'does not return the error test case' do
  149. is_expected.to be_empty
  150. end
  151. end
  152. context 'when head suite still has an error test case which errored in base' do
  153. before do
  154. base_suite.add_test_case(test_case_error)
  155. head_suite.add_test_case(test_case_error)
  156. end
  157. it 'returns the error test case' do
  158. is_expected.to eq([test_case_error])
  159. end
  160. end
  161. context 'when head suite has a success test case which errored in base' do
  162. before do
  163. base_suite.add_test_case(test_case_error)
  164. head_suite.add_test_case(test_case_success)
  165. end
  166. it 'does not return the error test case' do
  167. is_expected.to be_empty
  168. end
  169. end
  170. end
  171. describe '#resolved_errors' do
  172. subject { comparer.resolved_errors }
  173. context 'when head suite has a new error test case which does not exist in base' do
  174. before do
  175. base_suite.add_test_case(test_case_success)
  176. head_suite.add_test_case(test_case_error)
  177. end
  178. it 'does not return the error test case' do
  179. is_expected.to be_empty
  180. end
  181. it 'returns the correct resolved count' do
  182. expect(comparer.resolved_count).to eq(0)
  183. end
  184. end
  185. context 'when head suite still has an error test case which errored in base' do
  186. before do
  187. base_suite.add_test_case(test_case_error)
  188. head_suite.add_test_case(test_case_error)
  189. end
  190. it 'does not return the error test case' do
  191. is_expected.to be_empty
  192. end
  193. it 'returns the correct resolved count' do
  194. expect(comparer.resolved_count).to eq(0)
  195. end
  196. end
  197. context 'when head suite has a success test case which errored in base' do
  198. before do
  199. base_suite.add_test_case(test_case_error)
  200. head_suite.add_test_case(test_case_success)
  201. end
  202. it 'returns the resolved test case' do
  203. is_expected.to eq([test_case_success])
  204. end
  205. it 'returns the correct resolved count' do
  206. expect(comparer.resolved_count).to eq(1)
  207. end
  208. end
  209. end
  210. describe '#total_count' do
  211. subject { comparer.total_count }
  212. before do
  213. head_suite.add_test_case(test_case_success)
  214. end
  215. it 'returns the total test counts in head suite' do
  216. is_expected.to eq(1)
  217. end
  218. end
  219. describe '#failed_count' do
  220. subject { comparer.failed_count }
  221. context 'when there are a new failure and an existing failure' do
  222. let(:test_case_1_success) { create_test_case_rspec_success }
  223. let(:test_case_1_failed) { create_test_case_rspec_failed }
  224. let(:test_case_2_failed) { create_test_case_rspec_failed('case2') }
  225. before do
  226. base_suite.add_test_case(test_case_1_success)
  227. base_suite.add_test_case(test_case_2_failed)
  228. head_suite.add_test_case(test_case_1_failed)
  229. head_suite.add_test_case(test_case_2_failed)
  230. end
  231. it 'returns the correct count' do
  232. is_expected.to eq(2)
  233. end
  234. end
  235. context 'when there is a new failure' do
  236. before do
  237. base_suite.add_test_case(test_case_success)
  238. head_suite.add_test_case(test_case_failed)
  239. end
  240. it 'returns the correct count' do
  241. is_expected.to eq(1)
  242. end
  243. end
  244. context 'when there is an existing failure' do
  245. before do
  246. base_suite.add_test_case(test_case_failed)
  247. head_suite.add_test_case(test_case_failed)
  248. end
  249. it 'returns the correct count' do
  250. is_expected.to eq(1)
  251. end
  252. end
  253. end
  254. describe '#total_status' do
  255. subject { comparer.total_status }
  256. context 'when all test cases in head suite are success' do
  257. before do
  258. head_suite.add_test_case(test_case_success)
  259. end
  260. it 'returns the total status in head suite' do
  261. is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
  262. end
  263. end
  264. context 'when there is a failed test case in head suite' do
  265. before do
  266. head_suite.add_test_case(test_case_failed)
  267. end
  268. it 'returns the total status in head suite as failed' do
  269. is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
  270. end
  271. end
  272. context 'when there is an error test case in head suite' do
  273. before do
  274. head_suite.add_test_case(test_case_error)
  275. end
  276. it 'returns the total status in head suite as failed' do
  277. is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
  278. end
  279. end
  280. end
  281. describe '#limited_tests' do
  282. subject(:limited_tests) { comparer.limited_tests }
  283. context 'limits amount of tests returned' do
  284. before do
  285. stub_const("#{described_class}::DEFAULT_MAX_TESTS", 2)
  286. stub_const("#{described_class}::DEFAULT_MIN_TESTS", 1)
  287. end
  288. context 'prefers new over existing and resolved' do
  289. before do
  290. 3.times { add_new_failure }
  291. 3.times { add_new_error }
  292. 3.times { add_existing_failure }
  293. 3.times { add_existing_error }
  294. 3.times { add_resolved_failure }
  295. 3.times { add_resolved_error }
  296. end
  297. it 'returns 2 of each new category, and 1 of each resolved and existing' do
  298. expect(limited_tests.new_failures.count).to eq(2)
  299. expect(limited_tests.new_errors.count).to eq(2)
  300. expect(limited_tests.existing_failures.count).to eq(1)
  301. expect(limited_tests.existing_errors.count).to eq(1)
  302. expect(limited_tests.resolved_failures.count).to eq(1)
  303. expect(limited_tests.resolved_errors.count).to eq(1)
  304. end
  305. it 'does not affect the overall count' do
  306. expect(summary).to include(total: 18, resolved: 6, failed: 6, errored: 6)
  307. end
  308. end
  309. context 'prefers existing over resolved' do
  310. before do
  311. 3.times { add_existing_failure }
  312. 3.times { add_existing_error }
  313. 3.times { add_resolved_failure }
  314. 3.times { add_resolved_error }
  315. end
  316. it 'returns 2 of each existing category, and 1 of each resolved' do
  317. expect(limited_tests.new_failures.count).to eq(0)
  318. expect(limited_tests.new_errors.count).to eq(0)
  319. expect(limited_tests.existing_failures.count).to eq(2)
  320. expect(limited_tests.existing_errors.count).to eq(2)
  321. expect(limited_tests.resolved_failures.count).to eq(1)
  322. expect(limited_tests.resolved_errors.count).to eq(1)
  323. end
  324. it 'does not affect the overall count' do
  325. expect(summary).to include(total: 12, resolved: 6, failed: 3, errored: 3)
  326. end
  327. end
  328. context 'limits amount of resolved' do
  329. before do
  330. 3.times { add_resolved_failure }
  331. 3.times { add_resolved_error }
  332. end
  333. it 'returns 2 of each resolved category' do
  334. expect(limited_tests.new_failures.count).to eq(0)
  335. expect(limited_tests.new_errors.count).to eq(0)
  336. expect(limited_tests.existing_failures.count).to eq(0)
  337. expect(limited_tests.existing_errors.count).to eq(0)
  338. expect(limited_tests.resolved_failures.count).to eq(2)
  339. expect(limited_tests.resolved_errors.count).to eq(2)
  340. end
  341. it 'does not affect the overall count' do
  342. expect(summary).to include(total: 6, resolved: 6, failed: 0, errored: 0)
  343. end
  344. end
  345. end
  346. def summary
  347. {
  348. total: comparer.total_count,
  349. resolved: comparer.resolved_count,
  350. failed: comparer.failed_count,
  351. errored: comparer.error_count
  352. }
  353. end
  354. def add_new_failure
  355. failed_case = create_test_case_rspec_failed(SecureRandom.hex)
  356. head_suite.add_test_case(failed_case)
  357. end
  358. def add_new_error
  359. error_case = create_test_case_rspec_error(SecureRandom.hex)
  360. head_suite.add_test_case(error_case)
  361. end
  362. def add_existing_failure
  363. failed_case = create_test_case_rspec_failed(SecureRandom.hex)
  364. base_suite.add_test_case(failed_case)
  365. head_suite.add_test_case(failed_case)
  366. end
  367. def add_existing_error
  368. error_case = create_test_case_rspec_error(SecureRandom.hex)
  369. base_suite.add_test_case(error_case)
  370. head_suite.add_test_case(error_case)
  371. end
  372. def add_resolved_failure
  373. case_name = SecureRandom.hex
  374. failed_case = create_test_case_java_failed(case_name)
  375. success_case = create_test_case_java_success(case_name)
  376. base_suite.add_test_case(failed_case)
  377. head_suite.add_test_case(success_case)
  378. end
  379. def add_resolved_error
  380. case_name = SecureRandom.hex
  381. error_case = create_test_case_java_error(case_name)
  382. success_case = create_test_case_java_success(case_name)
  383. base_suite.add_test_case(error_case)
  384. head_suite.add_test_case(success_case)
  385. end
  386. end
  387. end