From 0d54160dc5d4ee8aa07adb9f58262ac97d7c07a4 Mon Sep 17 00:00:00 2001 From: James Earl Douglas Date: Fri, 9 Jan 2015 11:56:38 -0800 Subject: [PATCH 1/4] Add missing test, plus docs on increasing coverage --- .gitignore | 2 +- doc/coverage/README.md | 63 +++++++++++++++++++ doc/coverage/green.png | Bin 0 -> 28966 bytes doc/coverage/red.png | Bin 0 -> 30241 bytes test/features/pagecontent/putLatestFormat.js | 32 ++++++++++ 5 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 doc/coverage/README.md create mode 100644 doc/coverage/green.png create mode 100644 doc/coverage/red.png create mode 100644 test/features/pagecontent/putLatestFormat.js diff --git a/.gitignore b/.gitignore index e9b59b95c..897b9efb8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -coverage/ +/coverage/ config.yaml node_modules npm-debug.log diff --git a/doc/coverage/README.md b/doc/coverage/README.md new file mode 100644 index 000000000..3da68c87b --- /dev/null +++ b/doc/coverage/README.md @@ -0,0 +1,63 @@ +# Improving code coverage + +It's a rare project that maintains 100% code coverage, but in general we want to keep coverage as high as we can. This helps maintain a semi-formal specification of our software by enumerating the various use cases, and tracks which areas of the code are used to service the use cases. + +This also reveals areas of the code that are not used to service the specified use cases, which we want to know about so that we can either purge the dead code, or formalize and validate the use cases implied by the uncovered code. + +Let's find some uncovered code and add a test for it. + +``` +npm run-script coverage +``` + +Browsing the coverage report at *<project>/coverage/lcov-report/index.html*, we find some uncovered code: + +![red](https://raw.githubusercontent.com/wikimedia/restbase/master/doc/coverage/red.png) + +It looks like we forgot to test `putLatestFormat()` in the pagecontent bucket handler. Let's write a test for it: + + +*test/pagecontent/putLatestFormat.js:* + +```javascript +describe('pagecontent bucket handler', function() { + it('should allow the latest format to be submitted', function() { + this.timeout(20000); + return preq.put({ + uri: config.bucketURL + '/Main_Page/html', + headers: { 'content-type': 'text/html' }, + body: 'this is the latest' + }) + .then(function(res) { + assert.deepEqual(res.status, 201); + return preq.get({ + uri: config.bucketURL + '/Main_Page/html/' + res.headers.etag, + }); + }) + .then(function(res) { + assert.deepEqual(res.status, 200); + assert.deepEqual(res.body, 'this is the latest'); + }); + }); +}); +``` + +That should do it. Let's make sure it passes: + +``` +npm test +``` + +The test passes, so let's generate a new coverage report: + +``` +npm run-script coverage +``` + +Now we can verify that `putLatestFormat()` is now covered: + +![green](https://raw.githubusercontent.com/wikimedia/restbase/master/doc/coverage/green.png) + +Not only have we increased our code coverage, but we have reverse-engineered a specification for how a user can submit (and later retrieve) the latest format for some page content. + +We have also drawn attention to an interesting implementation detail: that in this case a PUT request results in a 201 status, which might hint that this ought to instead use a POST request. In any case, we have a point of reference for future design discussions and refactoring efforts. diff --git a/doc/coverage/green.png b/doc/coverage/green.png new file mode 100644 index 0000000000000000000000000000000000000000..68bb2245db5381f29d4e28c655d1f5d7079c42f9 GIT binary patch literal 28966 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 XM#}s@R#n#_fPYV)C`uMf7`*vEru8MO literal 0 HcmV?d00001 diff --git a/doc/coverage/red.png b/doc/coverage/red.png new file mode 100644 index 0000000000000000000000000000000000000000..d0bd924d9b7a259854dc782148aa751e9bcbdb77 GIT binary patch literal 30241 zcmce-bx@V>6E-dgQqmwwNC-$H(v5U?r%HEs9FP>GQ@XpmL6B}Z)S=_hozlMtuE=zcgpVIStlubhwp5@zoCm$KNJJ*t z7ZMTJ$m?+txVvmgF$|m!jpIcuxNw4pUq1Rp_$?ywX3rn`^))dxF}ph-E+%Q6pu4(U zr1IKt3|em-qz(=bA6IJM(P4WDJc0ZBwEH5uxXWve;$S?1`TK}dc>j8~_PEm{Cg+h z;mh;{mgLW~Yzl|59~O?TV3QuT?Pqe84fnrTt0F6z_(HX(+6G@0+M!vaMj6#wFZhW}Ih zD8?z?G)-o6W2;S~NX&?VsT+w|qfO*OO};~>j5qNqPaT__wP=4*UvGi%#hWN?GNVbRhDw7`GwK2|*WLB| zcMYq>ud9MZ3oLht$;}Y4R4nTX6eXfLNnA_YDP|)HVrYwwcL)c~&_%E|G9bkr_N=H@ zT3|~xoR~)41(y8)DPsy0yEGBMnk#1O?`U&QlhDc$wexo;JYf;)++zDYFsQw=;dn~NJsFd}hN{EeI zcF`bM>5If^?9W#rk3hX7Rj8h2&$DyN6=4+9P|=0ZDAwtW3AldP*S9(qS$bos#DM}! zvP=g%HH{a-6Rp=F9=JgFz4AK7K-g2#lN$5Yr$jOoJA~dZ+A_+1D&%bzrrI4~Q415C zr#V&W9ZX0u5NuANP)hN0J9I*WI981l$wlM_f~YSl50i<5lzlmRm2}1(G@p%gB%%E$ zuU9%E<5jdaUPOXf`uiOdF!yVNAf-+MS&I7sv{c*2l36+UdFy=kI#{f#iblvg2cxDk zs4}E0kP1y?WWY)o1ikq|Yh=R(jO^Qc3D@J_htXUF98a2JzT`RdGYo+b=p1!U#03w$ zHI=fERC(j$Rj39I?=qEC_oKgf1ws?GwITG-7m++*lY&}}ng>Y9)OJ8ECaP$wE)HpMiPaZQm>^B39p?#AXL zAve$Cvo=Rf=TH?XNGcSdqS=SMtAfx^UP!JL*J@;CDQA&oor{2Uw(;Y6~AdF+(jVkd8h&^I!UEo?0P5&9>P znqvqQtJo@CXHYSk$e~Vt$>+Js&lqR~YqxKJVISlJP{{@~``y@Z z8>d0m0r~+y{5%#DT3LzEnle^bt@>e`54NnNa4;A)A7F1cl?D}@SR?f$a&|+q(_7DM z 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 Date: Fri, 9 Jan 2015 11:59:33 -0800 Subject: [PATCH 2/4] Use commit hash rather than branch name for image links --- doc/coverage/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/coverage/README.md b/doc/coverage/README.md index 3da68c87b..25dc0abd1 100644 --- a/doc/coverage/README.md +++ b/doc/coverage/README.md @@ -12,7 +12,7 @@ npm run-script coverage Browsing the coverage report at *<project>/coverage/lcov-report/index.html*, we find some uncovered code: -![red](https://raw.githubusercontent.com/wikimedia/restbase/master/doc/coverage/red.png) +![red](https://raw.githubusercontent.com/wikimedia/restbase/0d54160dc5d4ee8aa07adb9f58262ac97d7c07a4/doc/coverage/red.png) It looks like we forgot to test `putLatestFormat()` in the pagecontent bucket handler. Let's write a test for it: @@ -56,7 +56,7 @@ npm run-script coverage Now we can verify that `putLatestFormat()` is now covered: -![green](https://raw.githubusercontent.com/wikimedia/restbase/master/doc/coverage/green.png) +![green](https://raw.githubusercontent.com/wikimedia/restbase/0d54160dc5d4ee8aa07adb9f58262ac97d7c07a4/doc/coverage/green.png) Not only have we increased our code coverage, but we have reverse-engineered a specification for how a user can submit (and later retrieve) the latest format for some page content. From a1970a2eb256c35a4e925d6dcb572c0716140016 Mon Sep 17 00:00:00 2001 From: James Earl Douglas Date: Fri, 9 Jan 2015 12:13:03 -0800 Subject: [PATCH 3/4] Add test and coverage screenshots --- doc/coverage/coverage.png | Bin 0 -> 6025 bytes doc/coverage/test.png | Bin 0 -> 700 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/coverage/coverage.png create mode 100644 doc/coverage/test.png diff --git a/doc/coverage/coverage.png b/doc/coverage/coverage.png new file mode 100644 index 0000000000000000000000000000000000000000..b01bea52e2d7021ff2598eaae11718efeb54fd0c GIT binary patch literal 6025 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 NP&JrpiHdd5e*iqsloJ2| literal 0 HcmV?d00001 diff --git a/doc/coverage/test.png b/doc/coverage/test.png new file mode 100644 index 0000000000000000000000000000000000000000..d69a9fbaa64f6b3f75bdfd91d658b71ad094e457 GIT binary patch literal 700 zcmeAS@N?(olHy`uVBq!ia0y~yV2TE^$;q z>#kteGoaN6N?F3P?s;AR{L|#Ce*N7@k@97>_kC{*f^_Dx$U1(u=!%qOe|E*T znSY#PEOqtB>)e*lF7-_x=7h7qF1n%8p1j!g2*~FTzA!!h-tmxokC4w%O&<=&S(j$8 zJ@d$V;`z(N;`~3+!w;Ll0hFL)u&(2=VXb8^DzpC8M134w!=b(_}ZgGN6mzLeLm`d~Yw59~N{BA123X72&^ YS@lhR>)0o4047HUPgg&ebxsLQ04}!%R{#J2 literal 0 HcmV?d00001 From 2bf155832737ad0ed93e20cd3e0d217619667c45 Mon Sep 17 00:00:00 2001 From: James Earl Douglas Date: Fri, 9 Jan 2015 12:14:26 -0800 Subject: [PATCH 4/4] Add test and coverage screenshots --- doc/coverage/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/coverage/README.md b/doc/coverage/README.md index 25dc0abd1..4b490d787 100644 --- a/doc/coverage/README.md +++ b/doc/coverage/README.md @@ -48,12 +48,16 @@ That should do it. Let's make sure it passes: npm test ``` +![test](https://raw.githubusercontent.com/wikimedia/restbase/a1970a2eb256c35a4e925d6dcb572c0716140016/doc/coverage/test.png) + The test passes, so let's generate a new coverage report: ``` npm run-script coverage ``` +![coverage](https://raw.githubusercontent.com/wikimedia/restbase/a1970a2eb256c35a4e925d6dcb572c0716140016/doc/coverage/coverage.png) + Now we can verify that `putLatestFormat()` is now covered: ![green](https://raw.githubusercontent.com/wikimedia/restbase/0d54160dc5d4ee8aa07adb9f58262ac97d7c07a4/doc/coverage/green.png)