

# Introduction
> This page will serve as a log and a resource for all the development activity being done in this project on testing. I have to write tests for the logic and views of Melange. The framework has undergone a major revision and the old tests are to be re-written.


# Meetings and Agendas

## Monday May 16, 2011 (Community Bonding Period) 10:10 UTC

### Notes
> Location : Gmail Chat

> Chaired by : Leo (Chong Liu)

> Notes taken by: Praveen

  * Told Leo that :
    * I have not been unable to concentrate on the project due to exams.
    * I have started reading the books which I had ordered, _'Django 1.1 Testing and Debugging, Karen M. Tracey'_ and _'Python Testing, Daniel Arbuckle'_
  * We discussed how to get started with the project.
  * Leo suggested:
    * start with soc.logic which are relatively easier and do not require much knowledge of Django and GAE
    * reuse the old tests which will require some modifications according to the new framework
    * after soc.logic attack modules.gsoc.logic and modules.gci.logic
    * write a python/shell script to calculate the frequency of a particular class and function which will give an idea about its importance and need for its thorough testing
  * We also discussed what functional testing is which I had not able to explain to Leo

## Wednesday May 24, 2011

### Notes
> Location: Gmail Chat

> Chaired by: Leo

> Notes by: Praveen

  * Told Leo that I am going slow at the project and had not implemented the view yet that we were supposed to do.
  * We discussed what should the basic approach be while writing a test.
  * Leo asked me to refer to some open-source web test runners and see how do they do it and implement a view for my Melange instance. He suggested gaeunit.
  * Leo also told me about 'Mocks'.

> ### Coding Plan for this week
  * Implement the view
  * Write test for at least one module in app.soc.logic

## Friday May 27, 2011

### Notes
> Location: Gmail Chat

> Chaired by: Leo

> Notes by: Praveen

  * Asked Leo what apiproxy is. I encountered apiproxy in the source of gaeunit. He explained apiproxy is like a mapping from a function to a function to which it stubs out or replaces.
  * Told Leo that I do not want to use gaeunit and rather write my own code for melange. Leo suggested to study gaeunit and see how they do the magic.
  * Asked Leo a couple of questions regarding TaskQueues and the meeting concluded with Leo asking me to explore and explore and learn.

## Monday May 30, 2011

### Notes
> Location: Gmail Chat

> Chaired by: Leo

> Notes by: Praveen

  * Reported my initial research regarding gaeunit to Leo
  * We discussed about how to handle the requests by the browser as there is a time restriction on a process in GAE.
  * gaeunit does not use TaskQueues and so Leo suggested that the other way to handle the requests would be by using a JavaScript. But I did not find any JavaScript in the code of gaeunit.
  * Since my main project is on testing, Leo put before me two options to choose from i.e to finish the online runner in a week or treat it as a side project and start testing. I chose to finish the online runner as I had already spent lot of time studying about it.
  * The conference call was suspended for the week.

## Monday June 6, 2011

### Notes
> Location: Gmail Chat

> Chaired by: Leo

> Notes by: Praveen

  * Told Leo that I have written the code for the online test runner and that it needs debugging.
  * Leo looked at the errors and told me that Nose uses some modules which are restricted by GAE. So we may have to try other options to make the runner.
  * The decision was made to write our own runner with the help of methods in unittest module in python.

> During: Melange Conference Call   Chaired by: Sverre   Notes by: Praveen

  * Told Sverre that I have been working on the online test runner in the week.
  * Sverre asked me to take it as a side project and start working on the Testing project now as the time is passing by.
  * Leo gave me two days to work on the test runner and finish the work which I started. If I am not successful, start testing.


## Wednesday June 8, 2011

### Notes
> Location: Gmail Chat

> Chaired by: Leo

> Notes by: Praveen

  * Informed Leo that I have finished writing the code for the online test runner and that the runner works on the local instance only.
  * It does not work on the live instance because our tests make use of gaetestbed library which imports mail\_stub from appengine library and mail\_stub can not work on a live instance as it starts a subprocess which is not allowed.
  * Leo asked me to start testing.


## Friday June 10, 2011

### Notes
> Location: Gmail Chat

> Chaired by: Leo

> Notes by: Praveen

  * Told Leo that I started working on testing today.
  * I asked him if every module in app.soc.logic needs to be tested. He told that all the non-trivial modules which are used presently needs to be tested.
  * I told him that I will start with the easier modules like soc.logic.tags, soc.logic.system etc.




# Coding Plan

## May 16 - May 22 (Community Bonding Period)
  * Upload a GAE instance and write a view to run all the tests and return all results back
  * Write a python script to calculate the frequency of a term in the codebase
  * Read Django and GAE documentation.

## May 23 - June 15 (Official Coding Period)
  * Generate the directory structure of soc.logic
  * Write tests for app.soc.logic and then for modules.gsoc.logic and modules.gci.logic

# Links
**My GSoC Proposal https://github.com/praveen97uma/GSoC-Docs/wiki/Testing,-Code-Guru-and-Quality-Assurance/**

**My melange instance http://melangetesting.appspot.com**

**A Web Test Runner http://code.google.com/p/gaeunit/**

# External Testing Resources
**_All I really need to know about [testable, maintainable, packagable] “scripts”_ http://www.testingtv.com/2010/01/27/all-i-really-need-to-know-about-testable-maintainable-packagable-scripts/**

**Building Tests for Large, Untested Codebases http://www.testingtv.com/2009/12/31/building-tests-for-large-untested-codebases/**

**Paver - Easy Build and Deployment Automation Tool for Python Projects http://www.testingtv.com/2010/02/03/paver-easy-build-and-deployment-automation-for-python-projects/**

