Repository: oppia/oppia

Issue:
Classroom page UI issues
Following are some UI issues in the classroom page that needs to be fixed:
- [x] “Create” button in the learner facing page does not make sense -- It can be removed.
- [x] Topic cards say “Stories” even though there is only one “Story”.
![Stories](https://user-images.githubusercontent.com/11008603/92075927-19832c80-edd7-11ea-9a25-a143d50fc78a.png)
- [x] Issues with the search bar (when logged out):
    - No placeholder text in the search bar.
    - The dropdowns for category and language have no text.
    - Alignment looks a bit off. The start of the search bar should be aligned with the start of the “Explore More Lessons” text.
![missing text](https://user-images.githubusercontent.com/11008603/92075992-3f103600-edd7-11ea-8932-38f0c83ba21c.png)
- [x] Search gets triggered even before I could finish typing and the results are shown on a different page. This is a bit confusing to the user. If we expect to show the results on a different page, the action to trigger a search should be more explicit (like clicking on a button).
![search](https://user-images.githubusercontent.com/11008603/92076287-eee5a380-edd7-11ea-8000-150db39268d5.gif)
- [x] Layout looks a bit odd. I feel like it could be “contained” better -- might look better if we brought the content to the center (considering there is a lot of text content). E.g. how medium articles are centered. Ditto for mobile screen.
- [x] Change "The Oppia Classroom Page” to “The Oppia Classroom”.
- [x] Search-bar hides the topic cards on landing on the page. Seems like a slight discoverability issue -- it wasn’t very obvious that there was more content below. It may be useful to have the search-bar be fixed at the bottom of the page rather than it be “sticky”. Especially considering that searching for other explorations and navigating away from the classroom page might not be what a new visitor to the classroom page should be expected to do.
![image](https://user-images.githubusercontent.com/11008603/92076226-ceb5e480-edd7-11ea-974e-9f97b985eef0.png)
- [x] Sign-in button is not aligned properly on mobile.
![signin](https://user-images.githubusercontent.com/11008603/92076166-aded8f00-edd7-11ea-9098-bca4a19539e4.png)
- [x] The paragraph text should be Roboto instead of Capriola.
- [x] Right-clicking on a topic tile leads to opening a page with just the image, rather than opening the topic in a new tab.



Discussion:

Resolving patch:
diff --git a/core/controllers/admin.py b/core/controllers/admin.py
--- a/core/controllers/admin.py
+++ b/core/controllers/admin.py
@@ -459,6 +459,24 @@ def _load_dummy_new_structures_data(self):
             self._reload_exploration('15')
             self._reload_exploration('25')
             self._reload_exploration('13')
+            exp_services.update_exploration(
+                self.user_id, '15', [exp_domain.ExplorationChange({
+                    'cmd': exp_domain.CMD_EDIT_EXPLORATION_PROPERTY,
+                    'property_name': 'correctness_feedback_enabled',
+                    'new_value': True
+                })], 'Changed correctness_feedback_enabled.')
+            exp_services.update_exploration(
+                self.user_id, '25', [exp_domain.ExplorationChange({
+                    'cmd': exp_domain.CMD_EDIT_EXPLORATION_PROPERTY,
+                    'property_name': 'correctness_feedback_enabled',
+                    'new_value': True
+                })], 'Changed correctness_feedback_enabled.')
+            exp_services.update_exploration(
+                self.user_id, '13', [exp_domain.ExplorationChange({
+                    'cmd': exp_domain.CMD_EDIT_EXPLORATION_PROPERTY,
+                    'property_name': 'correctness_feedback_enabled',
+                    'new_value': True
+                })], 'Changed correctness_feedback_enabled.')
 
             story = story_domain.Story.create_default_story(
                 story_id, 'Help Jaime win the Arcade', 'Description',
diff --git a/core/domain/story_services.py b/core/domain/story_services.py
--- a/core/domain/story_services.py
+++ b/core/domain/story_services.py
@@ -236,7 +236,7 @@ def does_story_exist_with_url_fragment(url_fragment):
 
 def validate_explorations_for_story(exp_ids, raise_error):
     """Validates the explorations in the given story and checks whether they
-    are compatible with the mobile app.
+    are compatible with the mobile app and ready for publishing.
 
     Args:
         exp_ids: list(str). The exp IDs to validate.
@@ -330,6 +330,14 @@ def validate_explorations_for_story(exp_ids, raise_error):
                     raise utils.ValidationError(error_string)
                 validation_error_messages.append(error_string)
 
+            if not exp.correctness_feedback_enabled:
+                error_string = (
+                    'Expected all explorations to have correctness feedback '
+                    'enabled. Invalid exploration: %s' % exp.id)
+                if raise_error:
+                    raise utils.ValidationError(error_string)
+                validation_error_messages.append(error_string)
+
             for state_name in exp.states:
                 state = exp.states[state_name]
                 if not state.interaction.is_supported_on_android_app():


Test patch:
diff --git a/core/controllers/admin_test.py b/core/controllers/admin_test.py
--- a/core/controllers/admin_test.py
+++ b/core/controllers/admin_test.py
@@ -347,8 +347,8 @@ def test_regenerate_topic_related_opportunities_action(self):
         topic_id = 'topic'
         story_id = 'story'
         self.save_new_valid_exploration(
-            '0', owner_id, title='title',
-            end_state_name='End State')
+            '0', owner_id, title='title', end_state_name='End State',
+            correctness_feedback_enabled=True)
         self.publish_exploration(owner_id, '0')
 
         topic = topic_domain.Topic.create_default_topic(
diff --git a/core/controllers/contributor_dashboard_test.py b/core/controllers/contributor_dashboard_test.py
--- a/core/controllers/contributor_dashboard_test.py
+++ b/core/controllers/contributor_dashboard_test.py
@@ -66,7 +66,8 @@ def setUp(self):
             self.owner_id,
             title='title %d' % i,
             category='category%d' % i,
-            end_state_name='End State'
+            end_state_name='End State',
+            correctness_feedback_enabled=True
         ) for i in python_utils.RANGE(2)]
 
         for exp in explorations:
@@ -348,7 +349,8 @@ def setUp(self):
             self.owner_id,
             title='title %d' % i,
             category='category%d' % i,
-            end_state_name='End State'
+            end_state_name='End State',
+            correctness_feedback_enabled=True
         ) for i in python_utils.RANGE(2)]
 
         for exp in explorations:
diff --git a/core/controllers/review_tests_test.py b/core/controllers/review_tests_test.py
--- a/core/controllers/review_tests_test.py
+++ b/core/controllers/review_tests_test.py
@@ -57,7 +57,8 @@ def setUp(self):
         self.story_url_fragment_1 = 'public-story-title'
         self.story_url_fragment_2 = 'private-story-title'
 
-        self.save_new_valid_exploration(self.exp_id, self.owner_id)
+        self.save_new_valid_exploration(
+            self.exp_id, self.owner_id, correctness_feedback_enabled=True)
         self.publish_exploration(self.owner_id, self.exp_id)
 
         self.node_1 = {
diff --git a/core/controllers/story_editor_test.py b/core/controllers/story_editor_test.py
--- a/core/controllers/story_editor_test.py
+++ b/core/controllers/story_editor_test.py
@@ -133,7 +133,8 @@ def test_validation_error_messages(self):
         self.login(self.ADMIN_EMAIL)
         self.save_new_valid_exploration(
             '0', self.admin_id, title='Title 1',
-            category='Mathematics', language_code='en')
+            category='Mathematics', language_code='en',
+            correctness_feedback_enabled=True)
         json_response = self.get_json(
             '%s/%s' % (
                 feconf.VALIDATE_STORY_EXPLORATIONS_URL_PREFIX, self.story_id),
@@ -409,7 +410,8 @@ def test_editable_story_handler_get(self):
         self.login(self.ADMIN_EMAIL)
         self.save_new_valid_exploration(
             '0', self.admin_id, title='Title 1',
-            category='Mathematics', language_code='en')
+            category='Mathematics', language_code='en',
+            correctness_feedback_enabled=True)
         self.publish_exploration(self.admin_id, '0')
         change_list = [story_domain.StoryChange({
             'cmd': story_domain.CMD_ADD_STORY_NODE,
diff --git a/core/controllers/story_viewer_test.py b/core/controllers/story_viewer_test.py
--- a/core/controllers/story_viewer_test.py
+++ b/core/controllers/story_viewer_test.py
@@ -57,11 +57,14 @@ def setUp(self):
         self.EXP_ID_7 = '7'
 
         self.save_new_valid_exploration(
-            self.EXP_ID_0, self.admin_id, title='Title 1', end_state_name='End')
+            self.EXP_ID_0, self.admin_id, title='Title 1', end_state_name='End',
+            correctness_feedback_enabled=True)
         self.save_new_valid_exploration(
-            self.EXP_ID_1, self.admin_id, title='Title 2', end_state_name='End')
+            self.EXP_ID_1, self.admin_id, title='Title 2', end_state_name='End',
+            correctness_feedback_enabled=True)
         self.save_new_valid_exploration(
-            self.EXP_ID_7, self.admin_id, title='Title 3', end_state_name='End')
+            self.EXP_ID_7, self.admin_id, title='Title 3', end_state_name='End',
+            correctness_feedback_enabled=True)
         self.publish_exploration(self.admin_id, self.EXP_ID_0)
         self.publish_exploration(self.admin_id, self.EXP_ID_1)
         self.publish_exploration(self.admin_id, self.EXP_ID_7)
diff --git a/core/controllers/suggestion_test.py b/core/controllers/suggestion_test.py
--- a/core/controllers/suggestion_test.py
+++ b/core/controllers/suggestion_test.py
@@ -1385,7 +1385,8 @@ def setUp(self):
         self.SKILL_DESCRIPTION = 'skill to link question to'
         exploration = self.save_new_valid_exploration(
             self.EXP_ID, self.owner_id, title='Exploration title',
-            category='Algebra', end_state_name='End State')
+            category='Algebra', end_state_name='End State',
+            correctness_feedback_enabled=True)
         self.publish_exploration(self.owner_id, self.EXP_ID)
 
         topic = topic_domain.Topic.create_default_topic(
@@ -1575,7 +1576,8 @@ def setUp(self):
         self.SKILL_DESCRIPTION = 'skill to link question to'
         exploration = self.save_new_valid_exploration(
             self.EXP_ID, self.owner_id, title='Exploration title',
-            category='Algebra', end_state_name='End State')
+            category='Algebra', end_state_name='End State',
+            correctness_feedback_enabled=True)
         self.publish_exploration(self.owner_id, self.EXP_ID)
 
         topic = topic_domain.Topic.create_default_topic(
diff --git a/core/domain/opportunity_jobs_one_off_test.py b/core/domain/opportunity_jobs_one_off_test.py
--- a/core/domain/opportunity_jobs_one_off_test.py
+++ b/core/domain/opportunity_jobs_one_off_test.py
@@ -23,8 +23,6 @@
 
 from constants import constants
 from core.domain import caching_services
-from core.domain import exp_domain
-from core.domain import exp_services
 from core.domain import opportunity_jobs_one_off
 from core.domain import opportunity_services
 from core.domain import skill_services
@@ -65,14 +63,15 @@ def setUp(self):
         story_id_1 = 'story1'
         story_id_2 = 'story2'
 
-        explorations = [exp_domain.Exploration.create_default_exploration(
+        explorations = [self.save_new_valid_exploration(
             '%s' % i,
+            self.owner_id,
             title='title %d' % i,
-            category='category%d' % i,
+            end_state_name='End State',
+            correctness_feedback_enabled=True
         ) for i in python_utils.RANGE(2)]
 
         for exp in explorations:
-            exp_services.save_new_exploration(self.owner_id, exp)
             self.publish_exploration(self.owner_id, exp.id)
 
         topic_1 = topic_domain.Topic.create_default_topic(
diff --git a/core/domain/opportunity_services_test.py b/core/domain/opportunity_services_test.py
--- a/core/domain/opportunity_services_test.py
+++ b/core/domain/opportunity_services_test.py
@@ -88,7 +88,8 @@ def setUp(self):
             self.owner_id,
             title='title %d' % i,
             category='category%d' % i,
-            end_state_name='End State'
+            end_state_name='End State',
+            correctness_feedback_enabled=True
         ) for i in python_utils.RANGE(5)]
 
         for exp in explorations:
@@ -755,7 +756,8 @@ def setUp(self):
             self.owner_id,
             title='title %d' % i,
             category='category%d' % i,
-            end_state_name='End State'
+            end_state_name='End State',
+            correctness_feedback_enabled=True
         ) for i in python_utils.RANGE(5)]
 
         for exp in explorations:
diff --git a/core/domain/opportunity_validators_test.py b/core/domain/opportunity_validators_test.py
--- a/core/domain/opportunity_validators_test.py
+++ b/core/domain/opportunity_validators_test.py
@@ -22,8 +22,6 @@
 import datetime
 
 from constants import constants
-from core.domain import exp_domain
-from core.domain import exp_services
 from core.domain import prod_validation_jobs_one_off
 from core.domain import question_services
 from core.domain import story_domain
@@ -67,14 +65,16 @@ def setUp(self):
 
         self.TOPIC_ID = 'topic'
         self.STORY_ID = 'story'
-        explorations = [exp_domain.Exploration.create_default_exploration(
+        explorations = [self.save_new_valid_exploration(
             '%s' % i,
+            self.owner_id,
             title='title %d' % i,
             category='category',
+            end_state_name='End State',
+            correctness_feedback_enabled=True
         ) for i in python_utils.RANGE(5)]
 
         for exp in explorations:
-            exp_services.save_new_exploration(self.owner_id, exp)
             self.publish_exploration(self.owner_id, exp.id)
 
         topic = topic_domain.Topic.create_default_topic(
@@ -250,7 +250,7 @@ def test_model_with_invalid_content_count(self):
                 u'[u\'failed validation check for content count check '
                 'of ExplorationOpportunitySummaryModel\', '
                 '[u"Entity id 1: Content count: 10 does not match the '
-                'content count of external exploration model: 1"]]'
+                'content count of external exploration model: 2"]]'
             ), u'[u\'fully-validated ExplorationOpportunitySummaryModel\', 2]']
         self.run_job_and_check_output(
             expected_output, sort=True, literal_eval=True)
diff --git a/core/domain/prod_validators_test.py b/core/domain/prod_validators_test.py
--- a/core/domain/prod_validators_test.py
+++ b/core/domain/prod_validators_test.py
@@ -14405,14 +14405,15 @@ def setUp(self):
         self.set_admins([self.OWNER_USERNAME])
         self.owner = user_services.UserActionsInfo(self.owner_id)
 
-        explorations = [exp_domain.Exploration.create_default_exploration(
+        explorations = [self.save_new_valid_exploration(
             '%s' % i,
+            self.owner_id,
             title='title %d' % i,
-            category='category%d' % i
-        ) for i in python_utils.RANGE(0, 4)]
+            end_state_name='End State',
+            correctness_feedback_enabled=True
+        ) for i in python_utils.RANGE(4)]
 
         for exp in explorations:
-            exp_services.save_new_exploration(self.owner_id, exp)
             rights_manager.publish_exploration(self.owner, exp.id)
 
         topic = topic_domain.Topic.create_default_topic(
diff --git a/core/domain/state_domain_test.py b/core/domain/state_domain_test.py
--- a/core/domain/state_domain_test.py
+++ b/core/domain/state_domain_test.py
@@ -1159,6 +1159,10 @@ def test_interaction_validation_for_android(self):
         init_state.update_interaction_id('NumericExpressionInput')
         self.assertTrue(init_state.interaction.is_supported_on_android_app())
 
+        # Empty interaction.
+        init_state.update_interaction_id(None)
+        self.assertTrue(init_state.interaction.is_supported_on_android_app())
+
         # Invalid interactions.
         init_state.update_interaction_id('CodeRepl')
         self.assertFalse(init_state.interaction.is_supported_on_android_app())
diff --git a/core/domain/story_services_test.py b/core/domain/story_services_test.py
--- a/core/domain/story_services_test.py
+++ b/core/domain/story_services_test.py
@@ -68,7 +68,8 @@ def setUp(self):
         topic_services.add_canonical_story(
             self.USER_ID, self.TOPIC_ID, self.STORY_ID)
         self.save_new_valid_exploration(
-            self.EXP_ID, self.user_id_admin, end_state_name='End')
+            self.EXP_ID, self.user_id_admin, end_state_name='End',
+            correctness_feedback_enabled=True)
         self.publish_exploration(self.user_id_admin, self.EXP_ID)
         changelist = [
             story_domain.StoryChange({
@@ -510,13 +511,16 @@ def test_exploration_context_model_is_modified_correctly(self):
             'Added node.')
         self.save_new_valid_exploration(
             '0', self.user_id_admin, title='Title 1',
-            category='Mathematics', language_code='en')
+            category='Mathematics', language_code='en',
+            correctness_feedback_enabled=True)
         self.save_new_valid_exploration(
             '1', self.user_id_admin, title='Title 2',
-            category='Mathematics', language_code='en')
+            category='Mathematics', language_code='en',
+            correctness_feedback_enabled=True)
         self.save_new_valid_exploration(
             '2', self.user_id_admin, title='Title 3',
-            category='Mathematics', language_code='en')
+            category='Mathematics', language_code='en',
+            correctness_feedback_enabled=True)
         self.publish_exploration(self.user_id_admin, '0')
         self.publish_exploration(self.user_id_admin, '1')
         self.publish_exploration(self.user_id_admin, '2')
@@ -741,7 +745,8 @@ def test_exploration_story_link_collision(self):
             self.USER_ID, self.TOPIC_ID, 'story_id_2')
         self.save_new_valid_exploration(
             '0', self.user_id_admin, title='Title 1',
-            category='Mathematics', language_code='en')
+            category='Mathematics', language_code='en',
+            correctness_feedback_enabled=True)
         self.publish_exploration(self.user_id_admin, '0')
 
         change_list = [story_domain.StoryChange({
@@ -896,7 +901,8 @@ def test_validate_exploration_returning_error_messages(self):
         topic_services.publish_story(
             self.TOPIC_ID, self.STORY_ID, self.user_id_admin)
         self.save_new_valid_exploration(
-            'exp_id_1', self.user_id_a, title='title', category='Category 1')
+            'exp_id_1', self.user_id_a, title='title', category='Category 1',
+            correctness_feedback_enabled=True)
         validation_error_messages = (
             story_services.validate_explorations_for_story(
                 ['invalid_exp', 'exp_id_1'], False))
@@ -913,7 +919,8 @@ def test_cannot_update_story_with_private_exploration_id(self):
         topic_services.publish_story(
             self.TOPIC_ID, self.STORY_ID, self.user_id_admin)
         self.save_new_valid_exploration(
-            'exp_id_1', self.user_id_a, title='title', category='Category 1')
+            'exp_id_1', self.user_id_a, title='title', category='Category 1',
+            correctness_feedback_enabled=True)
         change_list = [story_domain.StoryChange({
             'cmd': story_domain.CMD_UPDATE_STORY_NODE_PROPERTY,
             'property_name': (
@@ -951,11 +958,13 @@ def test_cannot_update_story_with_exps_with_different_categories(self):
         topic_services.publish_story(
             self.TOPIC_ID, self.STORY_ID, self.user_id_admin)
         self.save_new_valid_exploration(
-            'exp_id_1', self.user_id_a, title='title', category='Category 1')
+            'exp_id_1', self.user_id_a, title='title', category='Category 1',
+            correctness_feedback_enabled=True)
         self.publish_exploration(self.user_id_a, 'exp_id_1')
 
         self.save_new_valid_exploration(
-            'exp_id_2', self.user_id_a, title='title', category='Category 2')
+            'exp_id_2', self.user_id_a, title='title', category='Category 2',
+            correctness_feedback_enabled=True)
         self.publish_exploration(self.user_id_a, 'exp_id_2')
 
         change_list = [
@@ -1010,7 +1019,7 @@ def test_cannot_update_story_with_exps_with_other_languages(self):
             self.TOPIC_ID, self.STORY_ID, self.user_id_admin)
         self.save_new_valid_exploration(
             'exp_id_1', self.user_id_a, title='title', category='Category 1',
-            language_code='es')
+            language_code='es', correctness_feedback_enabled=True)
         self.publish_exploration(self.user_id_a, 'exp_id_1')
 
         change_list = [
@@ -1035,12 +1044,43 @@ def test_cannot_update_story_with_exps_with_other_languages(self):
             story_services.update_story(
                 self.USER_ID, self.STORY_ID, change_list, 'Updated story node.')
 
+    def test_cannot_update_story_with_exps_without_correctness_feedback(self):
+        topic_services.publish_story(
+            self.TOPIC_ID, self.STORY_ID, self.user_id_admin)
+        self.save_new_valid_exploration(
+            'exp_id_1', self.user_id_a, title='title', category='Category 1',
+            language_code='en')
+        self.publish_exploration(self.user_id_a, 'exp_id_1')
+
+        change_list = [
+            story_domain.StoryChange({
+                'cmd': story_domain.CMD_UPDATE_STORY_NODE_PROPERTY,
+                'property_name': (
+                    story_domain.STORY_NODE_PROPERTY_EXPLORATION_ID),
+                'node_id': self.NODE_ID_1,
+                'old_value': None,
+                'new_value': 'exp_id_1'
+            })
+        ]
+
+        validation_error_messages = (
+            story_services.validate_explorations_for_story(['exp_id_1'], False))
+        self.assertEqual(
+            validation_error_messages, [
+                'Expected all explorations to have correctness feedback '
+                'enabled. Invalid exploration: exp_id_1'])
+        with self.assertRaisesRegexp(
+            Exception, 'Expected all explorations to have correctness feedback '
+            'enabled. Invalid exploration: exp_id_1'):
+            story_services.update_story(
+                self.USER_ID, self.STORY_ID, change_list, 'Updated story node.')
+
     def test_cannot_update_story_with_exps_with_invalid_interactions(self):
         topic_services.publish_story(
             self.TOPIC_ID, self.STORY_ID, self.user_id_admin)
         self.save_new_valid_exploration(
             'exp_id_1', self.user_id_a, title='title', category='Category 1',
-            interaction_id='LogicProof')
+            interaction_id='LogicProof', correctness_feedback_enabled=True)
         self.publish_exploration(self.user_id_a, 'exp_id_1')
 
         change_list = [
@@ -1071,7 +1111,8 @@ def test_cannot_update_story_with_exps_with_recommended_exps(self):
             self.TOPIC_ID, self.STORY_ID, self.user_id_admin)
         self.save_new_valid_exploration(
             'exp_id_1', self.user_id_a, title='title', category='Category 1',
-            interaction_id='TextInput', end_state_name='End')
+            interaction_id='TextInput', end_state_name='End',
+            correctness_feedback_enabled=True)
         self.publish_exploration(self.user_id_a, 'exp_id_1')
 
         exp_services.update_exploration(
@@ -1115,7 +1156,7 @@ def test_cannot_update_story_with_exps_with_invalid_rte_content(self):
             self.TOPIC_ID, self.STORY_ID, self.user_id_admin)
         self.save_new_valid_exploration(
             'exp_id_1', self.user_id_a, title='title', category='Category 1',
-            end_state_name='End')
+            end_state_name='End', correctness_feedback_enabled=True)
         self.publish_exploration(self.user_id_a, 'exp_id_1')
         exp_services.update_exploration(
             self.user_id_a, 'exp_id_1', [exp_domain.ExplorationChange({
@@ -1161,7 +1202,8 @@ def test_cannot_update_story_with_exps_with_parameter_values(self):
         topic_services.publish_story(
             self.TOPIC_ID, self.STORY_ID, self.user_id_admin)
         self.save_new_valid_exploration(
-            'exp_id_1', self.user_id_a, title='title', category='Category 1')
+            'exp_id_1', self.user_id_a, title='title', category='Category 1',
+            correctness_feedback_enabled=True)
         exp_services.update_exploration(
             self.user_id_a, 'exp_id_1', [exp_domain.ExplorationChange({
                 'cmd': exp_domain.CMD_EDIT_EXPLORATION_PROPERTY,
@@ -1199,7 +1241,7 @@ def test_cannot_update_story_with_exps_with_parameter_values(self):
 
         self.save_new_valid_exploration(
             'exp_id_2', self.user_id_a, title='title 2', category='Category 1',
-            interaction_id='LogicProof')
+            interaction_id='LogicProof', correctness_feedback_enabled=True)
         exp_services.update_exploration(
             self.user_id_a, 'exp_id_2', [exp_domain.ExplorationChange({
                 'cmd': exp_domain.CMD_EDIT_EXPLORATION_PROPERTY,
diff --git a/core/domain/voiceover_services_test.py b/core/domain/voiceover_services_test.py
--- a/core/domain/voiceover_services_test.py
+++ b/core/domain/voiceover_services_test.py
@@ -67,7 +67,8 @@ def setUp(self):
             self.owner_id,
             title='title %d' % i,
             category='category%d' % i,
-            end_state_name='End State'
+            end_state_name='End State',
+            correctness_feedback_enabled=True
         ) for i in python_utils.RANGE(2)]
 
         for exp in explorations:
diff --git a/core/tests/test_utils.py b/core/tests/test_utils.py
--- a/core/tests/test_utils.py
+++ b/core/tests/test_utils.py
@@ -1360,8 +1360,8 @@ def save_new_valid_exploration(
             self, exploration_id, owner_id, title='A title',
             category='A category', objective='An objective',
             language_code=constants.DEFAULT_LANGUAGE_CODE,
-            end_state_name=None,
-            interaction_id='TextInput'):
+            end_state_name=None, interaction_id='TextInput',
+            correctness_feedback_enabled=False):
         """Saves a new strictly-validated exploration.
 
         Args:
@@ -1373,6 +1373,8 @@ def save_new_valid_exploration(
             language_code: str. The language_code of this exploration.
             end_state_name: str. The name of the end state for the exploration.
             interaction_id: str. The id of the interaction.
+            correctness_feedback_enabled: bool. Whether correctness feedback is
+                enabled for the exploration.
 
         Returns:
             Exploration. The exploration domain object.
@@ -1384,6 +1386,7 @@ def save_new_valid_exploration(
             exploration.states[exploration.init_state_name], interaction_id)
 
         exploration.objective = objective
+        exploration.correctness_feedback_enabled = correctness_feedback_enabled
 
         # If an end state name is provided, add terminal node with that name.
         if end_state_name is not None:
@@ -1396,6 +1399,8 @@ def save_new_valid_exploration(
             init_state = exploration.states[exploration.init_state_name]
             init_interaction = init_state.interaction
             init_interaction.default_outcome.dest = end_state_name
+            if correctness_feedback_enabled:
+                init_interaction.default_outcome.labelled_as_correct = True
 
         exp_services.save_new_exploration(owner_id, exploration)
         return exploration