Hi!

I've finished the testsuite for couch.js and jquery.couch.js. Comments still welcome.

http://github.com/lenalena/couchdb/tree/testsuite


I fixed a couple of things as I went along. Other things I haven't fixed yet, but created tickets, see below.

The major thing that has to be done now is the integration into Futon. As all the tests together (more than 500 assertions and even more database hits) need some time to run (around 250ms usually, YMMV). So it's maybe the best to provide the possibility to run the different files with the specs (I've split them into eight files, this can be changed easily) separately.

The most simple way to do this is to dublicate the run.html file, make each copy run one spec file, link them into Futon, and integrate the result somehow into Futon's CSS. Any takers?


Running it
~~~~~~~~~~

http://github.com/lenalena/couchdb/tree/testsuite

If you want to run the testsuite, clone the project, compile and run in dev mode, and browse to this site: http://127.0.0.1:5984/_utils/spec/run.html

It works in at least Firefox >= 3.6 and Safari >= 4.0.4.


What is where
~~~~~~~~~~~~~

 * The two files I've tested:
/share/www/script/couch.js
/share/www/script/jquery.couch.js

 * The JSpec library:
/share/www/script/jspec

 * Custom helpers I need in many of the specs
/share/www/spec/custom_helpers.js

 * The specs!
/share/www/spec/*_spec.js
I've split them in separate files because shorter files are nice. The division is more or less random. In general the specs are in the order the methods are in their files though.


How JSpec works
~~~~~~~~~~~~~~~

JSpec is a Javascript Unit Testing framework. I chose it because I was most familiar with it. JSpec uses a special DSL that doesn't look like Javascript, but the syntax is very similar to written english, just try to read and understand it :)

Within the JSpec context, every object gets extended with the "should" method. Should takes a matcher (eg "eql"). So I can do things like:
var mystring = "a string";
mystring.should.eql "a string"

It also lets you structure your tests nicely: stuff that belongs together is put into a "describe" block. The single assertion blocks ("it should do ...") are executed independently: Things you want to be done before or after every "it" block go into a "before_each" or "after_each" block within a "describe" block. I use this to delete and recreate the database after every assertion, so I really know what's in my database currently.

Read more about JSpec here: http://jspec.info/



Trouble shooting
~~~~~~~~~~~~~~~~

* When you change the specs, but your changes have no effect, manually reload the changed spec file in the browser.

* When the spec that tests erlang views fails, make sure you have enabled erlang views as described here:
 <http://wiki.apache.org/couchdb/EnableErlangViews>

* If you want to run only some of the specs: open /share/www/spec/run.html and uncomment the files with the specs you don't want to run.


Open Questions and TODOs
~~~~~~~~~~~~~~~~~~~~~~~~

* Two tests in jquery_couch_js_instance_methods_3_spec.js are failing: the query method ignores it when you want to filter for specific keys. This works with the query method in couch.js. The ticket is here:

https://issues.apache.org/jira/browse/COUCHDB-726


* Some methods only exist in jquery.couch.js and not in couch.js: signup, copyDoc, bulkRemove, allApps, config, compactView. Ticket:

https://issues.apache.org/jira/browse/COUCHDB-725

If someone wants to implement them (or one of them), I think it's a great job for a new contributor. It's mostly copy and paste and a bit of thinking. If you are a unsure of how to write the tests for it, I'm happy to help.


* One thing that stands out is that even though the methods in both files have the exact same outcome, they are named differently:

info/getVersion, save/saveDoc, deleteDoc/removeDoc, open/openDoc, deleteDb/drop, createDb/create.

I know it's like that because both files have been written by different people. I'm not in favor of either spelling, but I think the methods eventually should have the same names in both files. I guess it's better to do that as long as we're officially in beta. What do you think?


 * TODO: Futon integration, as described above.


Thanks for reading.
Lena


Reply via email to