Repository: oppia/oppia

Issue:
Finish writing remaining backend tests
## Note:  As it was getting hard to maintain the long conversastion thread in this issue we have moved this issue to #6550

_This is intended as a starter project for newer contributors._

We want to implement backend tests for all parts of the code that are missing them. For each file mentioned below, the parts missing can be identified by generating a coverage report (see [this wiki page](https://github.com/oppia/oppia/wiki/Writing-backend-tests)).

A basic understanding of Python and the codebase would be a suggested requirement for this issue. If you have trouble trying to figure out something in the codebase, take a look at [Analyzing the Codebase](https://github.com/oppia/oppia/wiki/Analyzing-the-codebase).

If you'd like to help with this issue, please select a file from the list below, and comment on the issue that you'd be taking it up, and submit a PR after writing tests for the file. You can also submit a PR which has partially completed tests for a file, if the file is too extensive to test in a single PR. Once the PR is submitted, you can tick the checkboxes.

(For guidance on how tests should be structured, please see [this wiki page](https://github.com/oppia/oppia/wiki/Writing-backend-tests#guidelines-for-writing-good-tests).)

----

The following files have been tested partially, but do not have 100% coverage. Any of these files can be taken up and tested comprehensively. (Note that the link after each file points to its coverage report on Codecov.)

 - [ ] core.controllers.admin ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers))
 - [ ] core.controllers.base ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers)) 
 - [ ] core.controllers.classifier ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers))
 - [ ] core.controllers.creator_dashboard ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers)) @lilithxxx (19th March 2019)
 - [ ] core.controllers.editor ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers))
 - [ ] core.controllers.email_dashboard ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers))
 - [ ] core.controllers.feedback ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers))
 - [ ] core.controllers.learner_dashboard ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers)) @manyaagarwal (1 April 2019)
 - [ ] core.controllers.library ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers)) 
 - [ ] core.controllers.pages ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers))  @netajik 
 - [ ] core.controllers.profile ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers)) 
 - [ ] core.controllers.reader ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers)) 
 - [ ] core.controllers.resources ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers))
 - [ ] core.controllers.story_editor ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers)) 
 - [ ] core.controllers.suggestion ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers)) 
 - [ ] core.controllers.topic_editor ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers))
 - [ ] core.controllers.translator ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers)) 

 - [ ] core.domain.acl_decorators ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.activity_jobs_one_off ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.acl_decorators ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.classifier_domain ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.classifier_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.collection_domain ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.collection_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain)) 
 - [ ] core.domain.config_domain ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.config_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.event_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.exp_domain ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain)) 
 - [ ] core.domain.exp_jobs_one_off ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.exp_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.feedback_jobs_continuous ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.feedback_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.fs_domain ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.html_validation_service ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain)) @ShubhamBansal1997 (7th March 2019)
 - [ ] core.domain.learner_progress_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain)) @ezl-13 
 - [ ] core.domain.obj_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain)) 
 - [ ] core.domain.param_domain ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain)) @nikhilmudholka  (PR at #6264)
 - [ ] core.domain.question_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.rating_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.recommendation_jobs_one_off ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.rights_manager ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.search_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.skill_domain ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.skill_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.stats_domain ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.stats_jobs_continuous ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.stats_jobs_one_off ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain)) 
 - [ ] core.domain.stats_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.story_domain ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.story_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.subtopic_page_domain ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain)) @anubhavsinha98 (No date of assignment)
 - [ ] core.domain.subtopic_page_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain)) @anubhavsinha98 (No date of assignment)
 - [ ] core.domain.suggestion_registry ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain)) @abhaygupta97 (No date of assignment)
 - [ ] core.domain.suggestion_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.summary_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.topic_domain ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.topic_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.user_jobs_continuous ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.user_jobs_one_off ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.user_query_jobs_one_off ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.domain.user_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/domain))
 - [ ] core.jobs ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core))

 - [ ] core.platform.email.gae_email_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/platform/email)) @siddhantkhandelwal (PR at #6335)
 - [ ] core.platform.image.gae_image_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/platform))
 - [ ] core.platform.search.gae_search_services ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/platform/search)) @lilithxxx (19th March 2019)

 - [ ] core.storage.base_model.gae_models ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/storage/base_model))
 - [ ] core.storage.classifier.gae_models ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/storage/classifier))
 - [ ] core.storage.collection.gae_models ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/storage/collection)) 
 - [ ] core.storage.email.gae_models ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/storage/email))  
 - [ ] core.storage.exploration.gae_models ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/storage/exploration)) @sophiewu6 (25 March 2019)
 - [ ] core.storage.feedback.gae_models ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/storage/feedback))
 - [ ] core.storage.file.gae_models ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/storage/file))
 - [ ] core.storage.question.gae_models ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/storage/question))
 - [ ] core.storage.statistics.gae_models ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/storage/statistics)) 
 - [ ] core.storage.user.gae_models ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/storage/user))

- [ ] scripts.custom_lint_checks (62%) ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/scripts))

---

**Completed:** 
  - [x] core.controllers.tasks -- @ctao5660
 - [x] core.controllers.collection_viewer ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers)) @jacoblipech 
 - [x] core.controllers.custom_landing_pages @gurungrahul2
 - [x] core.controllers.concept_card_viewer (92%) @xuanluong #5741
- [x] core.storage.skill.gae_models @sshou14 
- [x] core.controllers.recent_commits @sshou14 - #5551
- [x] core.controllers.skill_editor @xuanluong - #5686
- [x] core.controllers.topic_viewer @xuanluong - #5742
- [x] core.controllers.topics_and_skills_dashboard (96%) -- @xuanluong
- [x] core.domain.activity_domain @apb7 - #5194 
- [x] core.domain.calculation_registry @dawsoneliasen - #5391
 - [x] core.domain.learner_playlist_services @ezl-13 
- [x] core.domain.user_domain @unit-00 - #5380
- [x] core.platform.app_identity.gae_app_identity_services @neoliteconsultant - #5439
- [x] core.platform.memcache.gae_memcache_services @lilithxxx - #5355
 - [x] core.platform.models @varun-tandon  - # 6263
- [x] core.platform.taskqueue.gae_taskqueue_services @nalinbhardwaj
- [x] core.platform.users.gae_current_user_services @hemant0308 - #5563
- [x] core.storage.audit.gae_models @LanJosh - #5512
- [x] core.storage.collection.gae_models @LanJosh  - #5357
- [x] core.storage.config.gae_models  @dawsoneliasen 
- [x] core.storage.exploration.gae_models @sshou14  - #5552
- [X] core.storage.job.gae_models @sshou14 - #5433
- [X] core.storage.story.gae_models  @JoyLubega  - #5644
- [X] core.storage.topic.gae_models @tonadev - #5727
- [X] jinja_utils (87%) @hemant0308 -- #5582
 - [x] core.controllers.collection_editor @jacoblipech (10th March 2019)
 - [x] core.domain.learner_progress_domain -  @dchen97 #5859
 - [x] core.domain.question_domain (93%) - @rafalk342 #5887 
 - [x] core.domain.email_jobs_one_off (91%) @anubhavsinha98 
 - [x] core.platform.email.mailgun_email_services (42%) @ulloaluis #6133
 - [x] core.storage.file.gae_models (100%) @ankita240796 
 - [x] core.domain.collection_jobs_one_off (87%) @abhaygupta97 #6061
- [X] core.domain.email_manager @siddhantkhandelwal #6306 
- [X] schema_utils (96%) @ulloaluis  #6432 
-  [X] core.controllers.learner_dashboard ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers)) @varun-tandon (Upto 85%)
 - [x] core.controllers.question_editor ([coverage report](https://codecov.io/gh/oppia/oppia/tree/develop/core/controllers)) @ujjwalgulecha (#6217)


Discussion:
Hi @1995YogeshSharma, I'd like to implement backend tests for core.platform.models
Ok, assigned that to you.
I would like to work on **core.platform.users.gae_current_user_services** .
But I have a doubt..
How can we test GAE (Google App Engine) functionalities..??
HI @hemant0308, I have assigned that file to you.

You should go through the wiki pages linked in the issue description. I think that would make you clear on how to implement tests.


Please assign  core.controllers.tasks to me
Done -- go ahead, @mharelick :)
Hi! I would like to implement tests for core.domain.config_services
Hi @FinalHopee , I've assigned you for `core.domain.config_services`.
Another request for -- core.domain.learner_progress_domain
Hi @FinalHopee, assigned you :) 
Can I take a shot at writing the tests for core.domain.calculation_registry ?
Hi @dawsoneliasen, assigned you! 
Hi please assign core.platform.memcache.gae_memcache_services to me
Hi @lilithxxx, welcome to oppia, I think you haven't filled the survey yet, would you mind doing that (asked [here](https://github.com/oppia/oppia/wiki/Contributing-code-to-Oppia#setting-things-up) in 2nd bullet) after that I'll assign you for the ` core.platform.memcache.gae_memcache_services`. Thanks!
@DubeySandeep done
NB: I added @LanJosh to core.storage.audit.gae_models and core.storage.collection.gae_models on 20 July, he's planning to get these done (maybe with others!) by 27 July. (This comment is just for keeping track of when the assignment happened.)
@lilithxxx, I have assigned you for `core.platform.memcache.gae_memcache_services`.
Hi hello! May I be assigned `user_domain`?

Done! Assigned you :)
Hi, may I be assign to core.controllers.custom_landing_pages 
Hi @nindyahapsari, :) I've assigned you to `core.controllers.custom_landing_pages`. :)
Hi @prakharchoudhary, any updates on `core.platform.models`?
Hi,

I would like to write tests for core.platform.app_identity.gae_app_identity_services
Hi @neoliteconsultant, I have assigned you to core.platform.app_identity.gae_app_identity_services
Hi, I'd like to write tests for core.storage.job.gae_models.
Sounds good, thanks @sshou14. Assigned you!
I'm almost done with my assigned ticket. Can I write one more test for core.controllers.recent_commits if no one else is working on it? thanks!
Hi @sshou14, sounds good, thanks! Go for it :)  I've assigned you.
can you tell me what we have to do in file 
core.platform.taskqueue.gae_taskqueue_services

i cant understand
I'd like to work on the core.storage.config.gae_models test!
Hi @dawsoneliasen, assigned. Thanks!
Hi! Would like to work on core.platform.taskqueue.gae_taskqueue_services :-)
Hm, I think @nalinbhardwaj has been working on that (see #5451). Pick another one?

(Sorry that the list wasn't updated! I'll fix that.)
@seanlip   core.platform.transactions.gae_transaction_services then?
Sounds good, thanks! Assigned you.
@seanlip Can I take file.gae_models instead of transaction models?
Yep, assigned you. Thanks!
hey, can i work on core.controllers.custom_landing_pages
Deassigning @nindyahapsari from custom_landing_pages. Assigned @binaryman008 . Good luck!
Hi, I'd like to work also on core.storage.exploration.gae_models.
Hi @sshou14,  I've assigned you to `core.storage.exploration.gae_models.` you can start working! :)
Hi, i'd like to work on core.storage.skill.gae_models. thanks!
@sshou14 I haved assigned `core.storage.skill.gae_models` to you. Thanks!
Hi @DubeySandeep , Can I give a try for core.storage.recommendations.gae_models?
@son-vyas I have assigned core.storage.recommendations.gae_models to you. Best of luck!
Hi
I would like to work on **jinja_utils**
@hemant0308 I have assigned `jinja_utils` to you. Thanks for taking it up 👍 
Hello @hoangviet1993 
There is protected method in jinja_utils.
how to write tests for it.
the linter shows warning W0212.
Is there any way to overcome.
Hello, I would like to work on  `core.storage.story.gae_models`
Hi @JoyLubega , I have assigned you `core.storage.story.gae_models`. Welcome to Oppia!
@hemant0308 's question has been answered in related PR
@mharelick, any update on `controller.task` test? 
I hope to get it done this weekend. 

> On Aug 28, 2018, at 4:22 PM, Sandeep Dubey <notifications@github.com> wrote:
> 
> @mharelick <https://github.com/mharelick>, any update on controller.task test?
> 
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub <https://github.com/oppia/oppia/issues/5134#issuecomment-416727482>, or mute the thread <https://github.com/notifications/unsubscribe-auth/AjxjZxpEE6hAhhJcmoJvmHu3X9lytK8eks5uVaaXgaJpZM4UzO23>.
> 


Hi @JoyLubega, any updates on  `core.storage.story.gae_models` file?
Hi @vibhor98, I believe am done with the tests. A PR will be up tommorrow

hello @vibhor98 , i dont have permission to push my work.
```remote: Permission to oppia/oppia.git denied to JoyLubega.
fatal: unable to access 'https://github.com/oppia/oppia.git/': The requested URL returned error: 403```
Hi @JoyLubega, I think you're directly pushing to upstream. Try pushing to your forked branch and then make a PR from there. Like: `git push origin <branch_name>`.  Hope it resolves your problem!
@vibhor98 my PR is up 

Hi, I would like to work on  core.storage.topic.gae_models
Hi @tonadev, I've assigned you  `core.storage.topic.gae_models`. Please go ahead! :)
Hi, i would like to work on  **scripts/dockstrings_checker.py**
Hi @netajik,  you've been assigned `oppia.main` in #4374. Please try to complete that first and then I'll assign you this file. Thanks! 
Hello @DubeySandeep, @vibhor98  can you assign me one?

Hi @vibhor98, i would like to work on scripts/dockstrings_checker.py
Hi @DiegoCaraballo, I've assigned you to `collection_editor` part of this issue! :)
Hi @netajik, I'm going to assign you for `scripts/dockstrings_checker.py` part of this issue!

@netajik, I can not find scripts/dockstrings_checker.py, can you please recheck and tell me a correct filename?
Hi @DubeySandeep , it's  oppia/scripts/docstrings_checker.
Thanks @DubeySandeep I start working on that.

Hi @DubeySandeep, I would like to work on writing the tests for core.controllers.skill_editor.
@xuanluong I have assigned you `core.controllers.skill_editor`. Thanks!
Hi, I'd like to work on core.controllers.reader. Thanks!
Thanks @sshou14 -- assigned you!
Hi, I would like to implement tests for core.controllers.admin.
Hi @MichJP, I've assigned you `core.controllers.admin`. Thanks! 
Hi @binaryman008 any updates on this issue?
I request to work on
 core.storage.user.gae_models
Added you, @JoyLubega. Thanks! 
Hi  @DubeySandeep, i would like work on core.controllers.pages.
 I would like work on core.controllers.pages. Can any one assign me .
Hi @netajik, I've assigned you `core.controllers.pages`. Thanks! 
Hi, can I work on core.domain.config_services?
@coobubba sure, go ahead.

~Edit: sorry, that one is already taken. The top comment has not been updated for this. I'll do it now.~

Edit: it looks like the person assigned for core.domain.config_services has abandoned the issue (https://github.com/oppia/oppia/pull/5341), so I'm assigning it to you, @coobubba. Thanks!
Hi @coobubba, before sending a PR, would you mind following the instructions [here](https://github.com/oppia/oppia/wiki/Contributing-code-to-Oppia#setting-things-up) first to get started, please? This will allow us to accept your code. Thanks!
deassigning @binaryman008 due to lack of response
Assigning @kirakrishnan to core.controllers.custom_landing_pages
Hey can you assign me to core.storage.exploration.gae_models 
Hi @seritaevelyn, assigned you to both core.storage.exploration.gae_models and core.storage.feedback.gae_models.
core.controllers.admin (71%)

@Shuayb1 core.controllers.admin seems to be assigned to @MichJP already. Can you pick some some other file? Thanks.
Picked core.controllers.editor

But not yet assigned to me
unassigned @FinalHopee, @mharelick (from  core.domain.learner_progress_domain, core.controllers.tasks)

@prakharchoudhary, @durgeshra any update on the assigned issue? 

I'm new here. Can I be assigned to **core.storage.file.gae_models** ? 
I would like to begin working immediately. Thanks
Hi @nswarup14, I've assigned you. Please go ahead. Thanks! 
Assigned core.controllers.tasks to @ctao5660
As said in the gitter chat, I'm working on core.storage.email.gae_models 
@kirakrishnan, @coobubba, @son-vyas, @MichJP, @DiegoCaraballo, @netajik, @seritaevelyn, @nswarup14, any update on this?

@sshou14 are you still working on `core.controllers.reader`?
@JoyLubega, are you working on `core.storage.user.gae_models`?

de-assigned @prakharchoudhary, @durgeshra!
@DubeySandeep not any more, you can de-assign me from the item.

Thanks!
@sshou14, Update the issue, thanks for the info. :)  
Hello Sandeep, I am still working on it. my Pc had crashed a week back. But
am okay now. Thanks.


On Mon, Nov 5, 2018 at 8:50 PM Sandeep Dubey <notifications@github.com>
wrote:

> @sshou14 <https://github.com/sshou14>, Update the issue, thanks for the
> info. :)
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/5134#issuecomment-435969217>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/AccUCHl7bCpTD_ug4zKEqMh4qR3geYr8ks5usHp6gaJpZM4UzO23>
> .
>

Hey Sandeep, I'm working on my issue, I've just been busy so I haven't had time to really focus. I should have some time this week to really buckle down. Thanks.
Hello @DubeySandeep, sorry for the delay. I will update within few days. Thank you.
Can I be assigned **core.controllers.learner_dashboard** please?
Hi @varun-tandon, I've assigned you to  `core.controllers.learner_dashboard`. :)
@netajik, @JoyLubega, @coobubba Thanks for the update!
@DubeySandeep did you assign me to core.storage.email.gae_models ?
@CelineDknp, Thanks for the ping, Sorry I missed your [comment](https://github.com/oppia/oppia/issues/5134#issuecomment-435690992) but now I've assigned you to `core.storage.email.gae_models`. 
Can I be assigned to `core.domain.learner_progress_domain`? Thanks!
Can I also be assigned to `core.platform.models`?
Hi @dchen97, I've assigned you to `core.platform.models`. 
Hi @DubeySandeep, I'm working on my issue. Thanks.
@DubeySandeep may I also be assigned to core.domain.learner_progress_domain? I've been working on it and am pretty much ready to make a PR if someone isn't already working on it.
Hi @dchen97, assigned you! Thanks! 
Hi @DubeySandeep, 
Can I be assigned **core.controllers.translator** please?
Hi @szhang9246, I've assigned you to  `core.controllers.translator`. 
/cc @vibhor98 
Hi @MichJP, any updates on this? Thanks! 
Hi @DubeySandeep!
Can I be assigned to `core.domain.question_domain`?
Hello @DubeySandeep, would review my code. 
Hi, I am going to attempt core.controllers.classifier. Thanks
Hello @apb7, would review my pull request . Thanks.
Hi @kashifsoofi,  I've assigned you to ` core.controllers.classifier`.

Hi @netajik, I cannot find your PR, have you followed the instruction given in the [wiki](https://github.com/oppia/oppia/wiki/Contributing-code-to-Oppia#setting-things-up)?  

/cc @nithusha21 
Hello @DubeySandeep, would review my code. And if any changes are required please notify to me. Thank you.
Hello @apb7, would review my pull request . Thanks.
@netajik Have you created a PR? I can't find one.
Hello @apb7, i was already created PR. If any thing wrong please tell me.
I checked your fork, and it seems you have pushed to your local branch, but can you follow the steps [here](https://github.com/oppia/oppia/wiki/Contributing-code-to-Oppia#instructions-for-making-a-code-change) to create a pull request from that branch into develop?
Thank  you @apb7, for your information i will check and create PR.
I will work on `core.domain.question_domain`. 
Ah unless @nithusha21 are you already working on `core.domain.question_domain`?
Hi @lokijuhy, I am not working on it. However I think, @rafalk342 just completed it in #5887. So I think the task is complete! Would you like to pick another file?
Hello @apb7, would review my pull request . Thanks.
Deassigning @kirakrishnan due to lack of activity. Feel free to take it up again if you want to work on it.
Hi @DubeySandeep , I would like to complete backend testing for core.domain.rating_services

Hi @varun-tandon, any update on this issue?

Hi @AJ-54, I've assigned you to `core.domain.rating_services` 
Hi, could I be assigned to core.storage.statistics.gae_models? Thank you!
Hello @DubeySandeep, would  you review my request.
de-assigning @seritaevelyn  due to lack of activity. Please comment here if you want it assigned again.
de-assigning @DiegoCaraballo  due to lack of activity. Feel free to comment here is you want it assigned again.
Hello @1995YogeshSharma, would review my request. Thank you
Hi @1995YogeshSharma, Please assign `core.storage.file.gae_models` to me. Thanks!
@ankita240796, I've assigned you to  `core.storage.file.gae_models`, you can start working on it. 
Hello @DubeySandeep, please assign me  core.storage.exploration.gae_models.


Hi @DubeySandeep @1995YogeshSharma can you please assign `core.domain.exp_jobs_one_off` to me, Thanks!
Hi @ankita240796, I've assigned you to `core.domain.exp_jobs_one_off` you can start working on it! :)
Thanks!
Thanks @DubeySandeep :smile: 
@DubeySandeep can I work on  core.platform.models ?
Hi @ankit-kumar-dwivedi, Yes sure, I'll assign you the `core.platform.models`.
@DubeySandeep I would like to improve the coverage of ```core.domain.email_jobs_one_off``` . Please assign it to me !

Hi @anubhavsinha98, I've assigned you the `core.domain.email_jobs_one_off`. You can add the tests for it. Thanks!
Hi,
Can core.controllers.feedback be assigned to me?
TIA :)
Hi @alti-tude, assigned that to you.
@alti-tude @1995YogeshSharma  I apologize for not informing but I had already started the work, if @alti-tude  hasn'et started I can continue my work on core.controllers.feedback, can I ?
@gurungrahul2, In future make sure that the issue is assigned to you either through comment or through assignee option. For this, since I have assigned him just a while back he might not have started.

De-assigning @alti-tude  and assigning @gurungrahul2. @alti-tude please choose another file and I'll assign that to you. 
> @gurungrahul2, In future make sure that the issue is assigned to you either through comment or through assignee option. For this, since I have assigned him just a while back he might not have started.
> 
> De-assigning @alti-tude and assigning @gurungrahul2. @alti-tude please choose another file and I'll assign that to you.

thanks, I will keep that in mind.
Hello, Would like to be assigned to story services core.domain.story_services. 
> @gurungrahul2, In future make sure that the issue is assigned to you either through comment or through assignee option. For this, since I have assigned him just a while back he might not have started.
> 
> De-assigning @alti-tude and assigning @gurungrahul2. @alti-tude please choose another file and I'll assign that to you.

So, can i be assigned to core.controllers.story_editor, then?
Hi @enriquejosepadilla, I've assigned you `core.domain.story_services`, you can start working on this now :). Thanks
Hi @alti-tude, I've assigned you `core.controllers.story_editor`,  go ahead :).
Thanks
Hello,
I would like to work on core.domain.skill_services. Could it be assigned to me?
@bansalnitish @1995YogeshSharma
HI,
I would like to improve the coverage of `core.controllers.suggestion`.Can it be assigned to me?
Hi @aryan2305 and @dev-ritik, assigned you both. Go ahead, thanks! 
Hi all (@ctao5660 @coobubba @dchen97 @son-vyas @MichJP @varun-tandon @Shuayb1 @varun-tandon @szhang9246 @ankit-kumar-dwivedi @CelineDknp @nswarup14 @JoyLubega). any update on the assigned issue?
Core.controllers is done(100%) I tried checking the box myself but I guess
it didn’t work. It has already been merged.

On Thu, Jan 3, 2019 at 3:26 PM Sandeep Dubey <notifications@github.com>
wrote:

> Hi all (@ctao5660 <https://github.com/ctao5660> @coobubba
> <https://github.com/coobubba> @dchen97 <https://github.com/dchen97>
> @son-vyas <https://github.com/son-vyas> @MichJP
> <https://github.com/MichJP> @varun-tandon
> <https://github.com/varun-tandon> @Shuayb1 <https://github.com/Shuayb1>
> @varun-tandon <https://github.com/varun-tandon> @szhang9246
> <https://github.com/szhang9246> @ankit-kumar-dwivedi
> <https://github.com/ankit-kumar-dwivedi> @CelineDknp
> <https://github.com/CelineDknp> @nswarup14 <https://github.com/nswarup14>
> @JoyLubega <https://github.com/JoyLubega>). any update on the assigned
> issue?
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/5134#issuecomment-451266577>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/AmFbxoiG4YDPvB9KHV1oyMk8l6jxEf0Qks5u_mdogaJpZM4UzO23>
> .
>

Hi, I would like to work on `core.domain.collection_jobs_one_off`, kindly assign it to me.
Hi @abhaygupta97, I've assigned you to  `core.domain.collection_jobs_one_off`. Thanks!

/cc @1995YogeshSharma  
@DubeySandeep : I've done my pull request but I'm waiting for feedback from two members and haven't heard of them since two weeks :/
@DubeySandeep kindly assign me to a service. Thanks.
Hi @rakshitkumarcse, I've assigned you to `core.domain.collection_services`. Thanks! :)
@DubeySandeep Thanks! :)
Hi, I would like to work on `core.domain.stats_jobs_one_off`. Can this file be assigned to me?
I'm new here.  I would like to work on `core.domain.obj_services` .Could it be assigned to me?
Is anyone working on core.controllers.admin, if not can i

Hello  I am new here and i want to contribute from where i can start ?
> Hi all (@ctao5660 @coobubba @dchen97 @son-vyas @MichJP @varun-tandon @Shuayb1 @varun-tandon @szhang9246 @ankit-kumar-dwivedi @CelineDknp @nswarup14 @JoyLubega). any update on the assigned issue?

Working on completing this. I've been talking to Sean Lip and working with him to resolve some issues I was having. Should have a PR for some improvement to coverage within 12-24 hrs.
Hi Team , I would like to work on  core.controllers.admin . 
Hello! I would like to work on core.platform.email.mailgun_email_services. Thank you.
Hi @ulloaluis, I've assigned you to  `core.platform.email.mailgun_email_services`.
/cc @vibhor98 
Hi @rajibmitra and @Gauravpurohit409, I think you haven't signed the CLA yet, can you please go ahead and follow the steps stated [here](https://github.com/oppia/oppia/wiki/Contributing-code-to-Oppia#setting-things-up) to get started?

Once you are done with signing CLA, you can ping me here and I'll go ahead and assign you to the part of this issue. Thanks! :)
Hi @akeeoaobh and @aniket7joshi, I've assigned you to `core.domain.obj_services` and `core.domain.stats_jobs_one_off` respectively. You can start working on it :).

(_Sorry for being late on this! :(_ ) 
De-assigned @coobubba, @dchen97, @son-vyas, @MichJP, @Shuayb1, @szhang9246, @ankit-kumar-dwivedi, @nswarup14, @JoyLubega from this issue because of lack of response. 
Hi @DubeySandeep I have signed the CLA. Could you please assign me the issue. Thanks. 
Hi @DubeySandeep I have signed the CLA. Could you please assign me one of the issues. Thanks.

Hi @jeeb0xical, I've assigned you to `core.storage.recommendations.gae_models`. You can start working on it!. Thanks! :)
Woops, @DubeySandeep I didn't respond fast enough. I'm still waiting for one review on my PR about core.storage.email.gae_models; and I'm willing to finish it up if I get more change requests.
[Edit] : link to PR, in case it's useful : https://github.com/oppia/oppia/pull/5959
@CelineDknp, Ah, sorry I missed your last comment. Thanks for the update! I've re-assigned you to the same! (I've also updated my comments.)
Hi @gauravzqa, I've assigned you to `core.controllers.admin`, you can start working on it. Thanks! :) 

Hi @rajibmitra, Thanks for signing CLA, `core.controllers.admin` is assigned to @gauravzqa would you mind picking another part of this issue?
@DubeySandeep Sure , NP , you can assign me `core.controllers.reader` . Thanks,
@rajibmitra, I've assigned you to `core.controllers.reader`, you can start working on it. :) 
@DubeySandeep  Does Oppia have any slack channel or any other medium for continuous discussion ?
@rajibmitra, You can look into the wiki page for this kinda questions.  (see the [FAQs](https://github.com/oppia/oppia/wiki/Frequently-Asked-Questions#i-need-more-help-where-do-i-go-) page, I hope this helps.)
Got it, thanks. 

Please mark core.domain.collection_jobs_one_off as completed. It has 100% coverage due to https://github.com/oppia/oppia/pull/6061.
Hi! Can you assign me to learner_playlist_services.py? Thanks
@ezl-13, I've assigned you to `learner_playlist_services.py`.
Hi @DubeySandeep. Could I take up `core.domain.search_services` for now? Thanks.


Hi. Can I be assigned with `core.controllers.email_dashboard`? 
Hi @adityaprakash-bobby, I've assigned you to `ore.controllers.email_dashboard`, you can start working on it!
@DubeySandeep Hi, can I work on  `core.controllers.question_editor` test?
Thanks

Resolving patch:
diff --git a/core/controllers/question_editor.py b/core/controllers/question_editor.py
--- a/core/controllers/question_editor.py
+++ b/core/controllers/question_editor.py
@@ -137,8 +137,7 @@ def put(self, question_id):
                 'The question with the given id doesn\'t exist.')
 
         commit_message = self.payload.get('commit_message')
-        if not question_id:
-            raise self.PageNotFoundException
+
         if not commit_message:
             raise self.PageNotFoundException
         if not self.payload.get('change_list'):


Test patch:
diff --git a/core/controllers/question_editor_test.py b/core/controllers/question_editor_test.py
--- a/core/controllers/question_editor_test.py
+++ b/core/controllers/question_editor_test.py
@@ -67,7 +67,17 @@ def setUp(self):
         self.skill_id = skill_services.get_new_skill_id()
         self.save_new_skill(self.skill_id, self.admin_id, 'Skill Description')
 
-    def test_post(self):
+    def test_post_with_new_structures_disabled_returns_404_status(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', False):
+            self.login(self.ADMIN_EMAIL)
+            response = self.get_html_response(feconf.CREATOR_DASHBOARD_URL)
+            csrf_token = self.get_csrf_token_from_response(response)
+            self.post_json(
+                '%s/%s' % (feconf.NEW_QUESTION_URL, self.skill_id),
+                {}, csrf_token=csrf_token, expected_status_int=404)
+            self.logout()
+
+    def test_post_with_non_admin_or_topic_manager_email_disallows_access(self):
         with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
             self.login(self.NEW_USER_EMAIL)
             response = self.get_html_response(feconf.CREATOR_DASHBOARD_URL)
@@ -77,6 +87,45 @@ def test_post(self):
                 {}, csrf_token=csrf_token, expected_status_int=401)
             self.logout()
 
+    def test_post_with_editor_email_does_not_allow_question_creation(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
+            self.login(self.EDITOR_EMAIL)
+            response = self.get_html_response(feconf.CREATOR_DASHBOARD_URL)
+            csrf_token = self.get_csrf_token_from_response(response)
+            question_dict = self.question.to_dict()
+            question_dict['id'] = None
+            self.post_json(
+                '%s/%s' % (feconf.NEW_QUESTION_URL, self.skill_id), {
+                    'question_dict': question_dict
+                }, csrf_token=csrf_token, expected_status_int=401)
+            self.logout()
+
+    def test_post_with_incorrect_skill_id_returns_404(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
+            self.login(self.ADMIN_EMAIL)
+            response = self.get_html_response(feconf.CREATOR_DASHBOARD_URL)
+            csrf_token = self.get_csrf_token_from_response(response)
+            incorrect_skill_id = 'abc123456789'
+            self.post_json(
+                '%s/%s' % (feconf.NEW_QUESTION_URL, incorrect_skill_id),
+                {}, csrf_token=csrf_token, expected_status_int=404)
+            self.logout()
+
+    def test_post_with_incorrect_question_id_returns_400(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
+            self.login(self.ADMIN_EMAIL)
+            response = self.get_html_response(feconf.CREATOR_DASHBOARD_URL)
+            csrf_token = self.get_csrf_token_from_response(response)
+            question_dict = self.question.to_dict()
+            question_dict['id'] = 'abc123456789'
+            self.post_json(
+                '%s/%s' % (feconf.NEW_QUESTION_URL, self.skill_id), {
+                    'question_dict': question_dict
+                }, csrf_token=csrf_token, expected_status_int=400)
+            self.logout()
+
+    def test_post_with_admin_email_allows_question_creation(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
             self.login(self.ADMIN_EMAIL)
             response = self.get_html_response(feconf.CREATOR_DASHBOARD_URL)
             csrf_token = self.get_csrf_token_from_response(response)
@@ -94,6 +143,8 @@ def test_post(self):
             self.assertEqual(len(questions), 2)
             self.logout()
 
+    def test_post_with_topic_manager_email_allows_question_creation(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
             self.login(self.TOPIC_MANAGER_EMAIL)
             response = self.get_html_response(feconf.CREATOR_DASHBOARD_URL)
             csrf_token = self.get_csrf_token_from_response(response)
@@ -108,7 +159,7 @@ def test_post(self):
                 question_services.get_question_from_model(model)
                 for model in all_models
             ]
-            self.assertEqual(len(questions), 3)
+            self.assertEqual(len(questions), 2)
             self.logout()
 
 
@@ -125,7 +176,19 @@ def setUp(self):
             self.question_id_2, self.editor_id,
             self._create_valid_question_data('ABC'))
 
-    def test_post(self):
+    def test_post_with_new_structures_disabled_returns_404_status(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', False):
+            self.login(self.ADMIN_EMAIL)
+            response = self.get_html_response(feconf.CREATOR_DASHBOARD_URL)
+            csrf_token = self.get_csrf_token_from_response(response)
+            self.post_json(
+                '%s/%s/%s' % (
+                    feconf.QUESTION_SKILL_LINK_URL_PREFIX, self.question_id,
+                    self.skill_id
+                ), {}, csrf_token=csrf_token, expected_status_int=404)
+            self.logout()
+
+    def test_post_with_non_admin_or_topic_manager_email_disallows_access(self):
         with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
             self.login(self.NEW_USER_EMAIL)
             response = self.get_html_response(feconf.CREATOR_DASHBOARD_URL)
@@ -137,6 +200,21 @@ def test_post(self):
                 ), {}, csrf_token=csrf_token, expected_status_int=401)
             self.logout()
 
+    def test_post_with_incorrect_skill_id_returns_404(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
+            self.login(self.ADMIN_EMAIL)
+            response = self.get_html_response(feconf.CREATOR_DASHBOARD_URL)
+            csrf_token = self.get_csrf_token_from_response(response)
+            incorrect_skill_id = 'abc123456789'
+            self.post_json(
+                '%s/%s/%s' % (
+                    feconf.QUESTION_SKILL_LINK_URL_PREFIX, self.question_id,
+                    incorrect_skill_id
+                ), {}, csrf_token=csrf_token, expected_status_int=404)
+            self.logout()
+
+    def test_post_with_admin_email_allows_question_linking(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
             self.login(self.ADMIN_EMAIL)
             response = self.get_html_response(feconf.CREATOR_DASHBOARD_URL)
             csrf_token = self.get_csrf_token_from_response(response)
@@ -155,30 +233,35 @@ def test_post(self):
                 skill_descriptions[0], 'Skill Description')
             self.logout()
 
+    def test_post_with_topic_manager_email_allows_question_linking(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
             self.login(self.TOPIC_MANAGER_EMAIL)
             response = self.get_html_response(feconf.CREATOR_DASHBOARD_URL)
             csrf_token = self.get_csrf_token_from_response(response)
             self.post_json(
                 '%s/%s/%s' % (
-                    feconf.QUESTION_SKILL_LINK_URL_PREFIX, self.question_id_2,
+                    feconf.QUESTION_SKILL_LINK_URL_PREFIX, self.question_id,
                     self.skill_id
                 ), {}, csrf_token=csrf_token)
             question_summaries, skill_descriptions, _ = (
                 question_services.get_question_summaries_and_skill_descriptions(
                     5, [self.skill_id], ''))
-            self.assertEqual(len(question_summaries), 2)
-            question_ids = [
-                summary.id for summary in question_summaries
-            ]
-            self.assertItemsEqual(
-                question_ids, [self.question_id, self.question_id_2])
+            self.assertEqual(len(question_summaries), 1)
+            self.assertEqual(question_summaries[0].id, self.question_id)
+            self.assertEqual(skill_descriptions[0], 'Skill Description')
             self.logout()
 
-    def test_delete(self):
-        question_services.create_new_question_skill_link(
-            self.question_id, self.skill_id)
-        question_services.create_new_question_skill_link(
-            self.question_id_2, self.skill_id)
+    def test_delete_with_new_structures_disabled_returns_404_status(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', False):
+            self.login(self.ADMIN_EMAIL)
+            self.delete_json(
+                '%s/%s/%s' % (
+                    feconf.QUESTION_SKILL_LINK_URL_PREFIX, self.question_id,
+                    self.skill_id
+                ), expected_status_int=404)
+            self.logout()
+
+    def test_delete_with_non_admin_or_topic_manager_disallows_access(self):
         with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
             self.login(self.NEW_USER_EMAIL)
             self.delete_json(
@@ -188,6 +271,12 @@ def test_delete(self):
                 ), expected_status_int=401)
             self.logout()
 
+    def test_delete_with_admin_email_allows_question_deletion(self):
+        question_services.create_new_question_skill_link(
+            self.question_id, self.skill_id)
+        question_services.create_new_question_skill_link(
+            self.question_id_2, self.skill_id)
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
             self.login(self.ADMIN_EMAIL)
             self.delete_json(
                 '%s/%s/%s' % (
@@ -204,21 +293,32 @@ def test_delete(self):
                 skill_descriptions[0], 'Skill Description')
             self.logout()
 
+    def test_delete_with_topic_manager_email_allows_question_deletion(self):
+        question_services.create_new_question_skill_link(
+            self.question_id, self.skill_id)
+        question_services.create_new_question_skill_link(
+            self.question_id_2, self.skill_id)
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
             self.login(self.TOPIC_MANAGER_EMAIL)
             self.delete_json(
                 '%s/%s/%s' % (
-                    feconf.QUESTION_SKILL_LINK_URL_PREFIX, self.question_id_2,
+                    feconf.QUESTION_SKILL_LINK_URL_PREFIX, self.question_id,
                     self.skill_id
                 ))
-            question_summaries, _, _ = (
+            question_summaries, skill_descriptions, _ = (
                 question_services.get_question_summaries_and_skill_descriptions(
                     5, [self.skill_id], ''))
-            self.assertEqual(len(question_summaries), 0)
+            self.assertEqual(len(question_summaries), 1)
+            self.assertEqual(
+                question_summaries[0].id, self.question_id_2)
+            self.assertEqual(
+                skill_descriptions[0], 'Skill Description')
             self.logout()
 
 
 class EditableQuestionDataHandlerTest(BaseQuestionEditorControllerTests):
     """Tests get, put and delete methods of editable questions data handler."""
+
     def setUp(self):
         """Completes the setup for QuestionSkillLinkHandlerTest."""
         super(EditableQuestionDataHandlerTest, self).setUp()
@@ -228,10 +328,17 @@ def setUp(self):
         question_services.create_new_question_skill_link(
             self.question_id, self.skill_id)
 
-    def test_get(self):
+    def test_get_with_new_structures_disabled_returns_404_status(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', False):
+            self.login(self.ADMIN_EMAIL)
+            self.get_json(
+                '%s/%s' % (
+                    feconf.QUESTION_EDITOR_DATA_URL_PREFIX, self.question_id),
+                expected_status_int=404)
+            self.logout()
+
+    def test_get_with_non_admin_or_topic_manager_email_disallows_access(self):
         with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
-            # Check that non-admin and topic_manager cannot access the editor
-            # data.
             self.login(self.NEW_USER_EMAIL)
             self.get_json(
                 '%s/%s' % (
@@ -239,6 +346,8 @@ def test_get(self):
                 expected_status_int=401)
             self.logout()
 
+    def test_get_with_admin_email_allows_question_fetching(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
             self.login(self.ADMIN_EMAIL)
             response_dict = self.get_json('%s/%s' % (
                 feconf.QUESTION_EDITOR_DATA_URL_PREFIX, self.question_id))
@@ -256,6 +365,8 @@ def test_get(self):
                 self.skill_id)
             self.logout()
 
+    def test_get_with_topic_manager_email_allows_question_fetching(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
             self.login(self.TOPIC_MANAGER_EMAIL)
             response_dict = self.get_json('%s/%s' % (
                 feconf.QUESTION_EDITOR_DATA_URL_PREFIX, self.question_id))
@@ -273,7 +384,8 @@ def test_get(self):
                 self.skill_id)
             self.logout()
 
-            # Check that question creator can view the data.
+    def test_get_with_editor_email_allows_question_fetching(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
             self.login(self.EDITOR_EMAIL)
             response_dict = self.get_json('%s/%s' % (
                 feconf.QUESTION_EDITOR_DATA_URL_PREFIX, self.question_id))
@@ -291,16 +403,47 @@ def test_get(self):
                 self.skill_id)
             self.logout()
 
-    def test_delete(self):
-        self.login(self.ADMIN_EMAIL)
+
+    def test_delete_with_new_structures_disabled_returns_404_status(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', False):
+            self.login(self.ADMIN_EMAIL)
+            self.delete_json(
+                '%s/%s' % (
+                    feconf.QUESTION_EDITOR_DATA_URL_PREFIX, self.question_id),
+                expected_status_int=404)
+            self.logout()
+
+    def test_delete_with_incorrect_question_id_returns_404_status(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
+            self.login(self.ADMIN_EMAIL)
+            self.delete_json(
+                '%s/%s' % (
+                    feconf.QUESTION_EDITOR_DATA_URL_PREFIX, 'abc123456789'),
+                expected_status_int=404)
+            self.logout()
+
+    def test_delete_with_admin_email_allows_question_deletion(self):
         with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
+            self.login(self.ADMIN_EMAIL)
             self.delete_json(
                 '%s/%s' % (
                     feconf.QUESTION_EDITOR_DATA_URL_PREFIX, self.question_id),
                 expected_status_int=200)
             self.logout()
 
-    def test_put(self):
+    def test_put_with_new_structures_disabled_returns_404_status(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', False):
+            self.login(self.ADMIN_EMAIL)
+            response = self.get_html_response(feconf.CREATOR_DASHBOARD_URL)
+            csrf_token = self.get_csrf_token_from_response(response)
+            self.put_json(
+                '%s/%s' % (
+                    feconf.QUESTION_EDITOR_DATA_URL_PREFIX, self.question_id),
+                {},
+                csrf_token=csrf_token, expected_status_int=404)
+            self.logout()
+
+    def test_put_with_admin_email_allows_question_editing(self):
         with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
             payload = {}
             new_question_data = self._create_valid_question_data('DEF')
@@ -347,6 +490,19 @@ def test_put(self):
                 csrf_token=csrf_token, expected_status_int=404)
             self.logout()
 
+    def test_put_with_topic_manager_email_allows_question_editing(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
+            payload = {}
+            new_question_data = self._create_valid_question_data('DEF')
+            change_list = [{
+                'cmd': 'update_question_property',
+                'property_name': 'question_state_data',
+                'new_value': new_question_data.to_dict(),
+                'old_value': self.question.question_state_data.to_dict()
+            }]
+            payload['change_list'] = change_list
+            payload['commit_message'] = 'update question data'
+
             self.login(self.TOPIC_MANAGER_EMAIL)
             response = self.get_html_response(feconf.CREATOR_DASHBOARD_URL)
             csrf_token = self.get_csrf_token_from_response(response)
@@ -374,7 +530,19 @@ def test_put(self):
                 response_json['question_dict']['id'], self.question_id)
             self.logout()
 
-            # Check that the question creator can edit the question.
+    def test_put_with_editor_email_allows_question_editing(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
+            payload = {}
+            new_question_data = self._create_valid_question_data('DEF')
+            change_list = [{
+                'cmd': 'update_question_property',
+                'property_name': 'question_state_data',
+                'new_value': new_question_data.to_dict(),
+                'old_value': self.question.question_state_data.to_dict()
+            }]
+            payload['change_list'] = change_list
+            payload['commit_message'] = 'update question data'
+
             self.login(self.EDITOR_EMAIL)
             response = self.get_html_response(feconf.CREATOR_DASHBOARD_URL)
             csrf_token = self.get_csrf_token_from_response(response)
@@ -401,3 +569,24 @@ def test_put(self):
             self.assertEqual(
                 response_json['question_dict']['id'], self.question_id)
             self.logout()
+
+    def test_put_with_creating_new_fully_specified_question_returns_400(self):
+        with self.swap(constants, 'ENABLE_NEW_STRUCTURE_EDITORS', True):
+            payload = {}
+            self._create_valid_question_data('XXX')
+            change_list = [{
+                'cmd': 'create_new_fully_specified_question',
+                'question_dict': {},
+                'skill_id': 'abc123'
+            }]
+            payload['change_list'] = change_list
+            payload['commit_message'] = 'update question data'
+            self.login(self.ADMIN_EMAIL)
+            response = self.get_html_response(feconf.CREATOR_DASHBOARD_URL)
+            csrf_token = self.get_csrf_token_from_response(response)
+            self.put_json(
+                '%s/%s' % (
+                    feconf.QUESTION_EDITOR_DATA_URL_PREFIX, self.question_id),
+                payload,
+                csrf_token=csrf_token, expected_status_int=400)
+            self.logout()