Repository: oppia/oppia

Issue:
Dev server dummy topic should come pre-populated without any validation errors
When loading the dummy topic on the dev server, it comes loaded with 4 validation errors. We should just pre-populate it to not have any validation errors. Otherwise, developers will always need to fix those errors before being able to publish it. It's also weird that I've always had this 1 SVG file saved on my computer just for the purpose of uploading it to Oppia's dev server.
Dev server dummy topic should come pre-populated without any validation errors
When loading the dummy topic on the dev server, it comes loaded with 4 validation errors. We should just pre-populate it to not have any validation errors. Otherwise, developers will always need to fix those errors before being able to publish it. It's also weird that I've always had this 1 SVG file saved on my computer just for the purpose of uploading it to Oppia's dev server.


Discussion:
I am marking this as a good first issue. To address this issue, I suggest doing the following:

1) Try reproducing the error locally. Go to /admin > Activities and click each of the "load dummy data" buttons at the bottom. Record each of the errors that occur.
2) Fix each of the errors you found in (1) so that loading of dummy data works seamlessly.
3) Give yourself superadmin permissions, and visit the editor pages (topic editor, skill editor, exploration editor, etc.) for each of the dummy data items created. Check that each item is saveable without any warnings (i.e. that if you make a trivial change, you can publish the change automatically and there is no warning icon in the navbar). If there are warnings, fix the dummy data so that those warnings do not appear (see the [LaCE onboarding guide](https://github.com/oppia/oppia/wiki/LaCE-onboarding-guide) for details). Provide before-and-after screenshots of the topic editor / skill editor / etc. pages as well so we can confirm they look good.
4) (If needed) Extend the dummy data loading to add any missing steps that might have arisen due to infrastructural changes since they were implemented, Make sure the wording next to each button accurately describes the final state of things after the operation initiated by the button is fully performed.

**Note**: As you investigate this issue, we recommend chronicling your progress in a [debugging doc](https://github.com/oppia/oppia/wiki/Debugging-Docs). This can help others see your progress and help you if needed.

If you would like to take up this issue, please provide an explanation of what your PR will do (with names of files you're changing, what you plan to change in each file, etc.), and a link to your debugging doc (above). If it looks good, we can assign you to this issue.
Hello @EricZLou I have been able to successfully setup the dev server

 and and successfully did the Step 1 as mentioned above , tried to reproduce the error however I have not faced any validation errors, can you please tell me how to reproduce the issue. I am interested to take this issue. However during "Load new Dummy structures data" got one error on the console. I am also attaching the error I got.
Thank you
<img width="468" alt="image" src="https://github.com/oppia/oppia/assets/76656712/f6c3977a-ada2-45ee-9376-14cf87d15fe3">



@11happy Thanks for your note and sorry for the late reply. I just realized I missed a step in the [instructions above](https://github.com/oppia/oppia/issues/16016#issuecomment-1833843816), I've gone back and fixed them. Please could you take a look? (It's step 3.)

Also, the warnings that you have here (about the app not being able to send emails to users) are not relevant to this issue, so don't worry about those.
Sure I will look into it.
Hello @seanlip, I successfully performed 1st step and following error occurs:
"Server error: Topic with name 'Dummy Topic 1' already exists"
@masterboy376 You probably already have that topic loaded. You might need to restart from a clean server.

Also next time, please always post the error logs and full stacktrace when you post an error message -- it makes things easier to debug.
Hello @seanlip,
I have successfully reproduced the above issue.
On the editor tab, there are 4 validation warnings which come preloaded in a dummy topic:
![Screenshot (11)](https://github.com/oppia/oppia/assets/92575005/a5126cf3-44c3-47fb-ba5d-458869982ede)

There are 2 possible solutions to this issue that I can think of at this moment:
1. First Solution: 
- Make necessary changes to the dummy data to avoid  validation warnings, by making changes to [core/templates/pages/admin-page/activities-tab/admin-dev-mode-activities-tab.component.ts](core/templates/pages/admin-page/activities-tab/admin-dev-mode-activities-tab.component.ts) and [core/controllers/admin.py](core/controllers/admin.py)
- Leaving the validation rules intact, which are defined in [core/templates/domain/topic/topic-object.model.ts](core/templates/domain/topic/topic-object.model.ts)

2. Second Solution:
- Here we change the validation rules according to dummy data, which are defined in [core/templates/domain/topic/topic-object.model.ts](core/templates/domain/topic/topic-object.model.ts)

I prefer the first solution. Though, which ever solution you suggest can be implemented. I will be more than interested in solving this issue. 
Any Inputs from the community will help and is appreciated.
Regards
@masterboy376 Please go with the first solution. Can you explain what changes you'll make exactly and show proof that those changes don't result in warnings?

Also, could you please investigate and explain why the dummy data loading doesn't error here -- does it pass validation somehow? (As part of the fix for this issue, we should maybe add a backend test that tries to load dummy data so it catches this, and the backend ought to fail noisily if the dummy data doesn't pass strict validation -- that way, anyone who makes changes that result in strict validation failing will need to fix them so that this doesn't break other developers, and that is probably better than leaving the dummy data invalid which would cause problems for other devs.)
> @masterboy376 Please go with the first solution. Can you explain what changes you'll make exactly and show proof that those changes don't result in warnings?
> 
> Also, could you please investigate and explain why the dummy data loading doesn't error here -- does it pass validation somehow? (As part of the fix for this issue, we should maybe add a backend test that tries to load dummy data so it catches this, and the backend ought to fail noisily if the dummy data doesn't pass strict validation -- that way, anyone who makes changes that result in strict validation failing will need to fix them so that this doesn't break other developers, and that is probably better than leaving the dummy data invalid which would cause problems for other devs.)

@seanlip ,

I will change implementation of function _load_dummy_new_structures_data so that the all the validation checks passes on the dummy topic by default.

For the part of loading dummy data, the thing I found wrong is that it requires  the user to be a Curriculum Admin to load dummy data, but on the activities page it erroneously writes: admin can access that particular feature instead of writing Curriculum Admin.

Also, we can add a backend test that tries load dummy data by adding some tests to the existing activities.component.spec.ts.

Result:
![Screenshot (12)](https://github.com/oppia/oppia/assets/92575005/3018bfe5-f6f1-4841-a50b-53ecbb4b2a72)

Dummy data ready to be published by default.

@masterboy376 Thanks, some notes:

- You haven't answered this question: "Also, could you please investigate and explain why the dummy data loading doesn't error here -- does it pass validation somehow?". Why is the current dummy data not resulting in a server error when the button is clicked, and what specifically would you modify in the code to make that happen? For this question, please point to the specific line of code and show your proposed edits.
- Re "For the part of loading dummy data, the thing I found wrong is that it requires the user to be a Curriculum Admin to load dummy data, but on the activities page it erroneously writes: admin can access that particular feature instead of writing Curriculum Admin." -- we might need to fix that, yup. Probably just changing the text is enough (to direct the admin to give themselves Curriculum Admin permissions on the Roles tab).
- "Also, we can add a backend test that tries load dummy data by adding some tests to the existing activities.component.spec.ts." - I don't think this will work. The file you're referring to is a frontend file and it's not going to have access to the backend data. Given that this response is wrong, I can't conclude that you have a good enough understanding of this project to tackle it (at least not yet). I'm now going to ask that you try actually writing the test, running it to make sure it works, and screenshotting it here, before we assign you the issue.

Feel free to ask if you have any questions about the above -- thanks.
@seanlip, Thank you so much for these valuable inputs.

1. Current Dummy data is not resulting in a server error, because currently the "load data button" generate two topics with incomplete fields, which fails the pre-publish validation checks preventing these topics to be readily published. There is no validation tests to test whether the generated topic ( by the function "_load_dummy_new_structures_data" ) passes all validation checks until we actually try to publish it (we should add a backend test to check this). I made following changes to resolve the validation warning issues:
  1.1. added meta data content to the dummy topic 1:
   ![Screenshot (13)](https://github.com/oppia/oppia/assets/92575005/1781b4d4-c871-4f89-a679-f52a2c7d244e)
   1.2. added default thumbnail background image and color:
   ![Screenshot (14)](https://github.com/oppia/oppia/assets/92575005/01750215-06ec-46f1-9718-9ff9864b12f6)
   1.3. added default thumbnail background image and color to dummy subtopic:
   ![Screenshot (15)](https://github.com/oppia/oppia/assets/92575005/ebaa1cd5-7f2a-49ae-9dea-24c430cdd6d4)
   1.4. added diagnostic test to the topic testing atleast one skill (with at least 3 quesstions):
   ![Screenshot (16)](https://github.com/oppia/oppia/assets/92575005/ad29723e-45a4-4d69-a880-3d2f26e79a09)
   ![Screenshot (17)](https://github.com/oppia/oppia/assets/92575005/607c079b-1519-4536-8ff1-0e3bf868d1e9)
   ![Screenshot (18)](https://github.com/oppia/oppia/assets/92575005/35794f89-3db8-448c-8e00-1b9a261e8477)
   ![Screenshot (19)](https://github.com/oppia/oppia/assets/92575005/d6754888-4ee5-4ac1-92f7-6f940f25329b)
   ![Screenshot (20)](https://github.com/oppia/oppia/assets/92575005/15dabf14-be8f-4ff7-8d67-247e91c285f6)

2. I am working on the Backend test and will soon come up with it.

I have following queries related to this issue:

1.  Currently the "_load_dummy_new_structures_data" function generates two topics with name "Dummy Topic 1" and "Empty Topic". In the above screenshots I only resolved the validation warnings is the "Dummy Topic 1". In the later one, as the suggests, the topic should be empty. So, should I resolve warnings in "Empty Topic" as well or should it be left as it is? 
2. On the thumbnail upload modal there are two different guidelines of which the first on is applicable in the dev server.
![Screenshot (21)](https://github.com/oppia/oppia/assets/92575005/401430c0-aed0-4787-9b34-4354f161b659)


I am marking this as a good first issue. To address this issue, I suggest doing the following:

1) Try reproducing the error locally. Go to /admin > Activities and click each of the "load dummy data" buttons at the bottom. Record each of the errors that occur.
2) Fix each of the errors you found in (1) so that loading of dummy data works seamlessly.
3) Give yourself superadmin permissions, and visit the editor pages (topic editor, skill editor, exploration editor, etc.) for each of the dummy data items created. Check that each item is saveable without any warnings (i.e. that if you make a trivial change, you can publish the change automatically and there is no warning icon in the navbar). If there are warnings, fix the dummy data so that those warnings do not appear (see the [LaCE onboarding guide](https://github.com/oppia/oppia/wiki/LaCE-onboarding-guide) for details). Provide before-and-after screenshots of the topic editor / skill editor / etc. pages as well so we can confirm they look good.
4) (If needed) Extend the dummy data loading to add any missing steps that might have arisen due to infrastructural changes since they were implemented, Make sure the wording next to each button accurately describes the final state of things after the operation initiated by the button is fully performed.

**Note**: As you investigate this issue, we recommend chronicling your progress in a [debugging doc](https://github.com/oppia/oppia/wiki/Debugging-Docs). This can help others see your progress and help you if needed.

If you would like to take up this issue, please provide an explanation of what your PR will do (with names of files you're changing, what you plan to change in each file, etc.), and a link to your debugging doc (above). If it looks good, we can assign you to this issue.
Hello @EricZLou I have been able to successfully setup the dev server

 and and successfully did the Step 1 as mentioned above , tried to reproduce the error however I have not faced any validation errors, can you please tell me how to reproduce the issue. I am interested to take this issue. However during "Load new Dummy structures data" got one error on the console. I am also attaching the error I got.
Thank you
<img width="468" alt="image" src="https://github.com/oppia/oppia/assets/76656712/f6c3977a-ada2-45ee-9376-14cf87d15fe3">



@11happy Thanks for your note and sorry for the late reply. I just realized I missed a step in the [instructions above](https://github.com/oppia/oppia/issues/16016#issuecomment-1833843816), I've gone back and fixed them. Please could you take a look? (It's step 3.)

Also, the warnings that you have here (about the app not being able to send emails to users) are not relevant to this issue, so don't worry about those.
Sure I will look into it.
Hello @seanlip, I successfully performed 1st step and following error occurs:
"Server error: Topic with name 'Dummy Topic 1' already exists"
@masterboy376 You probably already have that topic loaded. You might need to restart from a clean server.

Also next time, please always post the error logs and full stacktrace when you post an error message -- it makes things easier to debug.
Hello @seanlip,
I have successfully reproduced the above issue.
On the editor tab, there are 4 validation warnings which come preloaded in a dummy topic:
![Screenshot (11)](https://github.com/oppia/oppia/assets/92575005/a5126cf3-44c3-47fb-ba5d-458869982ede)

There are 2 possible solutions to this issue that I can think of at this moment:
1. First Solution: 
- Make necessary changes to the dummy data to avoid  validation warnings, by making changes to [core/templates/pages/admin-page/activities-tab/admin-dev-mode-activities-tab.component.ts](core/templates/pages/admin-page/activities-tab/admin-dev-mode-activities-tab.component.ts) and [core/controllers/admin.py](core/controllers/admin.py)
- Leaving the validation rules intact, which are defined in [core/templates/domain/topic/topic-object.model.ts](core/templates/domain/topic/topic-object.model.ts)

2. Second Solution:
- Here we change the validation rules according to dummy data, which are defined in [core/templates/domain/topic/topic-object.model.ts](core/templates/domain/topic/topic-object.model.ts)

I prefer the first solution. Though, which ever solution you suggest can be implemented. I will be more than interested in solving this issue. 
Any Inputs from the community will help and is appreciated.
Regards
@masterboy376 Please go with the first solution. Can you explain what changes you'll make exactly and show proof that those changes don't result in warnings?

Also, could you please investigate and explain why the dummy data loading doesn't error here -- does it pass validation somehow? (As part of the fix for this issue, we should maybe add a backend test that tries to load dummy data so it catches this, and the backend ought to fail noisily if the dummy data doesn't pass strict validation -- that way, anyone who makes changes that result in strict validation failing will need to fix them so that this doesn't break other developers, and that is probably better than leaving the dummy data invalid which would cause problems for other devs.)
> @masterboy376 Please go with the first solution. Can you explain what changes you'll make exactly and show proof that those changes don't result in warnings?
> 
> Also, could you please investigate and explain why the dummy data loading doesn't error here -- does it pass validation somehow? (As part of the fix for this issue, we should maybe add a backend test that tries to load dummy data so it catches this, and the backend ought to fail noisily if the dummy data doesn't pass strict validation -- that way, anyone who makes changes that result in strict validation failing will need to fix them so that this doesn't break other developers, and that is probably better than leaving the dummy data invalid which would cause problems for other devs.)

@seanlip ,

I will change implementation of function _load_dummy_new_structures_data so that the all the validation checks passes on the dummy topic by default.

For the part of loading dummy data, the thing I found wrong is that it requires  the user to be a Curriculum Admin to load dummy data, but on the activities page it erroneously writes: admin can access that particular feature instead of writing Curriculum Admin.

Also, we can add a backend test that tries load dummy data by adding some tests to the existing activities.component.spec.ts.

Result:
![Screenshot (12)](https://github.com/oppia/oppia/assets/92575005/3018bfe5-f6f1-4841-a50b-53ecbb4b2a72)

Dummy data ready to be published by default.

@masterboy376 Thanks, some notes:

- You haven't answered this question: "Also, could you please investigate and explain why the dummy data loading doesn't error here -- does it pass validation somehow?". Why is the current dummy data not resulting in a server error when the button is clicked, and what specifically would you modify in the code to make that happen? For this question, please point to the specific line of code and show your proposed edits.
- Re "For the part of loading dummy data, the thing I found wrong is that it requires the user to be a Curriculum Admin to load dummy data, but on the activities page it erroneously writes: admin can access that particular feature instead of writing Curriculum Admin." -- we might need to fix that, yup. Probably just changing the text is enough (to direct the admin to give themselves Curriculum Admin permissions on the Roles tab).
- "Also, we can add a backend test that tries load dummy data by adding some tests to the existing activities.component.spec.ts." - I don't think this will work. The file you're referring to is a frontend file and it's not going to have access to the backend data. Given that this response is wrong, I can't conclude that you have a good enough understanding of this project to tackle it (at least not yet). I'm now going to ask that you try actually writing the test, running it to make sure it works, and screenshotting it here, before we assign you the issue.

Feel free to ask if you have any questions about the above -- thanks.
@seanlip, Thank you so much for these valuable inputs.

1. Current Dummy data is not resulting in a server error, because currently the "load data button" generate two topics with incomplete fields, which fails the pre-publish validation checks preventing these topics to be readily published. There is no validation tests to test whether the generated topic ( by the function "_load_dummy_new_structures_data" ) passes all validation checks until we actually try to publish it (we should add a backend test to check this). I made following changes to resolve the validation warning issues:
  1.1. added meta data content to the dummy topic 1:
   ![Screenshot (13)](https://github.com/oppia/oppia/assets/92575005/1781b4d4-c871-4f89-a679-f52a2c7d244e)
   1.2. added default thumbnail background image and color:
   ![Screenshot (14)](https://github.com/oppia/oppia/assets/92575005/01750215-06ec-46f1-9718-9ff9864b12f6)
   1.3. added default thumbnail background image and color to dummy subtopic:
   ![Screenshot (15)](https://github.com/oppia/oppia/assets/92575005/ebaa1cd5-7f2a-49ae-9dea-24c430cdd6d4)
   1.4. added diagnostic test to the topic testing atleast one skill (with at least 3 quesstions):
   ![Screenshot (16)](https://github.com/oppia/oppia/assets/92575005/ad29723e-45a4-4d69-a880-3d2f26e79a09)
   ![Screenshot (17)](https://github.com/oppia/oppia/assets/92575005/607c079b-1519-4536-8ff1-0e3bf868d1e9)
   ![Screenshot (18)](https://github.com/oppia/oppia/assets/92575005/35794f89-3db8-448c-8e00-1b9a261e8477)
   ![Screenshot (19)](https://github.com/oppia/oppia/assets/92575005/d6754888-4ee5-4ac1-92f7-6f940f25329b)
   ![Screenshot (20)](https://github.com/oppia/oppia/assets/92575005/15dabf14-be8f-4ff7-8d67-247e91c285f6)

2. I am working on the Backend test and will soon come up with it.

I have following queries related to this issue:

1.  Currently the "_load_dummy_new_structures_data" function generates two topics with name "Dummy Topic 1" and "Empty Topic". In the above screenshots I only resolved the validation warnings is the "Dummy Topic 1". In the later one, as the suggests, the topic should be empty. So, should I resolve warnings in "Empty Topic" as well or should it be left as it is? 
2. On the thumbnail upload modal there are two different guidelines of which the first on is applicable in the dev server.
![Screenshot (21)](https://github.com/oppia/oppia/assets/92575005/401430c0-aed0-4787-9b34-4354f161b659)



Resolving patch:
diff --git a/core/controllers/admin.py b/core/controllers/admin.py
--- a/core/controllers/admin.py
+++ b/core/controllers/admin.py
@@ -55,6 +55,8 @@
 from core.domain import stats_services
 from core.domain import story_domain
 from core.domain import story_services
+from core.domain import subtopic_page_domain
+from core.domain import subtopic_page_services
 from core.domain import topic_domain
 from core.domain import topic_fetchers
 from core.domain import topic_services
@@ -619,8 +621,6 @@ def _load_dummy_new_structures_data(self) -> None:
                 raise Exception(
                     'User does not have enough rights to generate data.')
             topic_id_1 = topic_fetchers.get_new_topic_id()
-            topic_id_2 = topic_fetchers.get_new_topic_id()
-
             story_id = story_services.get_new_story_id()
 
             skill_id_1 = skill_services.get_new_skill_id()
@@ -650,12 +650,11 @@ def _load_dummy_new_structures_data(self) -> None:
                 question_id_4, 'Question 4', [skill_id_1])
             question_5 = self._create_dummy_question(
                 question_id_5, 'Question 5', [skill_id_1])
-
             question_services.add_question(self.user_id, question_1)
-            question_services.add_question(self.user_id, question_4)
-            question_services.add_question(self.user_id, question_5)
             question_services.add_question(self.user_id, question_2)
             question_services.add_question(self.user_id, question_3)
+            question_services.add_question(self.user_id, question_4)
+            question_services.add_question(self.user_id, question_5)
 
             question_services.create_new_question_skill_link(
                 self.user_id, question_id_1, skill_id_1, 0.3)
@@ -671,21 +670,35 @@ def _load_dummy_new_structures_data(self) -> None:
             topic_1 = topic_domain.Topic.create_default_topic(
                 topic_id_1, 'Dummy Topic 1', 'dummy-topic-one', 'description',
                 'fragm')
-            topic_1.skill_ids_for_diagnostic_test = [skill_id_1]
-            topic_1.thumbnail_filename = 'thumbnail.svg'
-            topic_1.thumbnail_bg_color = '#C6DCDA'
-            topic_1.subtopics = [
-                topic_domain.Subtopic(
-                    1, 'Title', [skill_id_1], 'image.svg',
-                    constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0], 21131,
-                    'dummy-subtopic-three')]
-            topic_1.next_subtopic_id = 2
-            topic_1.add_canonical_story(story_id)
-
-            topic_2 = topic_domain.Topic.create_default_topic(
-                topic_id_2, 'Empty Topic', 'empty-topic', 'description',
-                'fragm')
 
+            topic_1.update_meta_tag_content('dummy-meta')
+            raw_image = b''
+            with open(
+                'core/tests/data/thumbnail.svg', 'rt',
+                encoding='utf-8') as svg_file:
+                svg_file_content = svg_file.read()
+                raw_image = svg_file_content.encode('ascii')
+            fs_services.save_original_and_compressed_versions_of_image(
+                'thumbnail.svg', feconf.ENTITY_TYPE_TOPIC, topic_id_1,
+                raw_image, 'thumbnail', False)
+            topic_services.update_thumbnail_filename(topic_1, 'thumbnail.svg')
+            topic_1.update_thumbnail_bg_color('#C6DCDA')
+            topic_1.add_canonical_story(story_id)
+            topic_1.add_uncategorized_skill_id(skill_id_1)
+            topic_1.add_uncategorized_skill_id(skill_id_2)
+            topic_1.add_uncategorized_skill_id(skill_id_3)
+            topic_1.update_skill_ids_for_diagnostic_test([skill_id_1])
+            topic_1.add_subtopic(1, 'Dummy Subtopic Title', 'dummysubtopic')
+            topic_services.update_subtopic_thumbnail_filename(
+                topic_1, 1, 'thumbnail.svg')
+            topic_1.update_subtopic_thumbnail_bg_color(
+                1, constants.ALLOWED_THUMBNAIL_BG_COLORS['subtopic'][0])
+            topic_1.move_skill_id_to_subtopic(None, 1, skill_id_2)
+            topic_1.move_skill_id_to_subtopic(None, 1, skill_id_3)
+
+            subtopic_page = (
+                subtopic_page_domain.SubtopicPage.create_default_subtopic_page(
+                    1, topic_id_1))
             # These explorations were chosen since they pass the validations
             # for published stories.
             self._reload_exploration('6')
@@ -772,8 +785,15 @@ def generate_dummy_story_nodes(
             skill_services.save_new_skill(self.user_id, skill_3)
             story_services.save_new_story(self.user_id, story)
             topic_services.save_new_topic(self.user_id, topic_1)
-            topic_services.publish_topic(topic_id_1, self.user_id)
-            topic_services.save_new_topic(self.user_id, topic_2)
+            subtopic_page_services.save_subtopic_page(
+                self.user_id, subtopic_page, 'Added subtopic',
+                [topic_domain.TopicChange({
+                    'cmd': topic_domain.CMD_ADD_SUBTOPIC,
+                    'subtopic_id': 1,
+                    'title': 'Dummy Subtopic Title',
+                    'url_fragment': 'dummy-fragment'
+                })]
+            )
 
             # Generates translation opportunities for the Contributor Dashboard.
             exp_ids_in_story = story.story_contents.get_all_linked_exp_ids()
@@ -781,6 +801,7 @@ def generate_dummy_story_nodes(
                 story_id, exp_ids_in_story)
 
             topic_services.publish_story(topic_id_1, story_id, self.user_id)
+            topic_services.publish_topic(topic_id_1, self.user_id)
         else:
             raise Exception('Cannot load new structures data in production.')
 


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
@@ -543,13 +543,9 @@ def test_load_new_structures_data(self) -> None:
                 'action': 'generate_dummy_new_structures_data'
             }, csrf_token=csrf_token)
         topic_summaries = topic_fetchers.get_all_topic_summaries()
-        self.assertEqual(len(topic_summaries), 2)
-        for summary in topic_summaries:
-            if summary.name == 'Dummy Topic 1':
-                topic_id = summary.id
-        story_id = (
-            topic_fetchers.get_topic_by_id(
-                topic_id).canonical_story_references[0].story_id)
+        self.assertEqual(len(topic_summaries), 1)
+        story_id = topic_fetchers.get_topic_by_id(
+            topic_summaries[0].id).canonical_story_references[0].story_id
         self.assertIsNotNone(
             story_fetchers.get_story_by_id(story_id, strict=False))
         skill_summaries = skill_services.get_all_skill_summaries()
diff --git a/core/tests/data/thumbnail.svg b/core/tests/data/thumbnail.svg
new file mode 100644
--- /dev/null
+++ b/core/tests/data/thumbnail.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1080" height="770" viewBox="0 0 1080 770" version="1.1"><path d="M 297 293.500 L 297 341 317.864 341 C 346.924 341, 355.458 339.004, 365.452 329.869 C 371.784 324.083, 375.391 317.372, 377.486 307.483 C 381.386 289.074, 377.656 270.256, 368.019 259.711 C 357.651 248.367, 349.264 246.036, 318.750 246.015 L 297 246 297 293.500 M 316 293.400 L 316 325 326.318 325 C 339.780 325, 346.104 323.159, 351.632 317.632 C 357.086 312.177, 359 305.742, 359 292.856 C 359 281.279, 356.786 274.088, 351.752 269.310 C 345.645 263.514, 342.677 262.594, 328.750 262.179 L 316 261.799 316 293.400 M 508.183 270.139 C 505.808 271.314, 502.681 273.760, 501.234 275.574 C 499.786 277.388, 498.242 278.649, 497.801 278.377 C 497.360 278.105, 497 275.884, 497 273.441 L 497 269 488.500 269 L 480 269 480 305 L 480 341 488.919 341 L 497.839 341 498.169 317.750 C 498.470 296.622, 498.687 294.143, 500.550 290.592 C 504.637 282.803, 515.634 280.548, 520.717 286.457 C 522.967 289.074, 523 289.481, 523 315.056 L 523 341 531.873 341 L 540.745 341 541.177 318.237 C 541.648 293.423, 542.392 289.896, 548.023 285.788 C 553.474 281.813, 562.575 282.656, 565.288 287.387 C 566.126 288.847, 566.600 297.454, 566.825 315.250 L 567.149 341 576.143 341 L 585.137 341 584.819 312.250 C 584.509 284.345, 584.430 283.358, 582.129 278.684 C 578.676 271.671, 573.862 268.819, 564.461 268.216 C 554.726 267.591, 549.472 269.521, 544.006 275.730 C 541.789 278.249, 539.851 280.127, 539.697 279.905 C 533.272 270.566, 528.899 268.055, 519 268.023 C 514.342 268.008, 511.277 268.607, 508.183 270.139 M 632.183 270.139 C 629.808 271.314, 626.681 273.760, 625.234 275.574 C 623.786 277.388, 622.242 278.649, 621.801 278.377 C 621.360 278.105, 621 275.884, 621 273.441 L 621 269 612.500 269 L 604 269 604 305 L 604 341 612.919 341 L 621.839 341 622.169 317.750 C 622.470 296.622, 622.687 294.143, 624.550 290.592 C 628.637 282.803, 639.634 280.548, 644.717 286.457 C 646.967 289.074, 647 289.481, 647 315.056 L 647 341 655.873 341 L 664.745 341 665.177 318.237 C 665.648 293.423, 666.392 289.896, 672.023 285.788 C 677.474 281.813, 686.575 282.656, 689.288 287.387 C 690.126 288.847, 690.600 297.454, 690.825 315.250 L 691.149 341 700.143 341 L 709.137 341 708.819 312.250 C 708.509 284.345, 708.430 283.358, 706.129 278.684 C 702.676 271.671, 697.862 268.819, 688.461 268.216 C 678.726 267.591, 673.472 269.521, 668.006 275.730 C 665.789 278.249, 663.851 280.127, 663.697 279.905 C 657.272 270.566, 652.899 268.055, 643 268.023 C 638.342 268.008, 635.277 268.607, 632.183 270.139 M 396.006 296.250 C 396.009 311.419, 396.457 325.104, 397.016 327.118 C 399.806 337.161, 406.920 342, 418.896 342 C 428.086 342, 434.011 339.468, 437.861 333.895 C 439.313 331.794, 440.837 330.059, 441.250 330.038 C 441.663 330.017, 442 332.475, 442 335.500 L 442 341 450.500 341 L 459 341 459 305 L 459 269 450.065 269 L 441.131 269 440.815 292.750 C 440.515 315.405, 440.395 316.668, 438.234 320.144 C 434.482 326.178, 425.944 328.754, 419.472 325.805 C 414.384 323.487, 414 321.258, 414 294.050 L 414 269 405 269 L 396 269 396.006 296.250 M 720 269.750 C 720 270.163, 726.354 287.018, 734.120 307.207 L 748.240 343.915 746.302 347.651 C 743.420 353.203, 740.007 355.321, 733.787 355.418 C 730.879 355.463, 727.104 355.141, 725.398 354.703 L 722.295 353.906 720.799 361.425 L 719.303 368.945 722.656 370.051 C 728.252 371.898, 741.220 371.438, 746.247 369.215 C 751.614 366.841, 756.766 361.684, 760.351 355.096 C 762.936 350.348, 793 271.956, 793 269.966 C 793 269.417, 789.172 269, 784.136 269 L 775.273 269 771.678 279.250 C 769.701 284.887, 765.766 296.137, 762.933 304.250 C 760.100 312.363, 757.440 319, 757.022 319 C 756.605 319, 752.266 307.753, 747.382 294.006 L 738.500 269.012 729.250 269.006 C 724.163 269.003, 720 269.337, 720 269.750 M 823 426.295 C 817.975 428.025, 815.287 433.678, 816.912 439.102 C 818.323 443.808, 821.975 446.455, 827.062 446.455 C 833.925 446.455, 838.333 442.366, 838.333 436 C 838.333 428.145, 831.039 423.528, 823 426.295 M 281 476.500 L 281 527 289.918 527 L 298.836 527 299.168 504.250 C 299.460 484.245, 299.732 481.033, 301.420 477.632 C 304.710 471.004, 312.705 467.696, 320.091 469.909 C 326.941 471.961, 327.385 473.818, 327.822 502.250 L 328.202 527 337.101 527 L 346 527 345.994 503.250 C 345.988 476.225, 345.190 469.450, 341.270 463.140 C 337.574 457.191, 332.480 454.629, 323.420 454.163 C 314.908 453.725, 307.642 456.366, 303.087 461.554 C 301.493 463.369, 299.921 464.588, 299.594 464.261 C 299.267 463.934, 299 455.192, 299 444.833 L 299 426 290 426 L 281 426 281 476.500 M 573 476.461 L 573 527 582 527 L 591 527 591 522.297 L 591 517.594 594.750 521.248 C 599.722 526.093, 604.623 528, 612.102 528 C 620.504 528, 625.302 526.367, 630.601 521.702 C 638.799 514.486, 642.578 502.835, 641.694 487.500 C 640.980 475.108, 638.200 467.926, 631.623 461.479 C 625.920 455.890, 621.215 454, 613 454 C 605.516 454, 600.543 455.770, 595.463 460.241 L 591.045 464.131 590.772 445.315 L 590.500 426.500 581.750 426.211 L 573 425.922 573 476.461 M 857.022 470.250 C 857.042 511.240, 857.181 514.802, 858.905 518.599 C 861.883 525.156, 866.020 527.447, 875.500 527.788 C 879.900 527.947, 884.054 527.700, 884.731 527.241 C 885.611 526.644, 885.784 524.493, 885.337 519.703 L 884.711 513 881.427 513 C 874.807 513, 875 514.350, 875 467.929 L 875 426 866 426 L 857 426 857.022 470.250 M 195 440 L 195 448 208.500 448 L 222 448 222 487.500 L 222 527 231.500 527 L 241 527 241 487.500 L 241 448 254.500 448 L 268 448 268 440 L 268 432 231.500 432 L 195 432 195 440 M 477.134 455.540 C 475.283 456.343, 472.020 458.913, 469.884 461.250 L 466 465.499 466 460.250 L 466 455 457 455 L 448 455 448 491 L 448 527 456.893 527 L 465.786 527 466.200 504.250 C 466.524 486.449, 466.956 480.721, 468.186 477.918 C 471.163 471.133, 478.480 467.683, 485.193 469.899 C 491.270 471.904, 491.461 472.809, 491.835 501.250 L 492.174 527 501.087 527 L 510 527 510.022 504.250 C 510.041 484.088, 510.259 481.025, 511.938 477.328 C 512.980 475.033, 514.978 472.405, 516.378 471.488 C 519.717 469.300, 525.793 468.557, 529.298 469.909 C 534.405 471.877, 535 475.277, 535 502.468 L 535 527 544.068 527 L 553.135 527 552.818 497.750 C 552.514 469.758, 552.404 468.321, 550.278 464.345 C 546.002 456.349, 539.822 453.492, 528.392 454.225 C 520.125 454.756, 514.144 457.825, 511.162 463.066 C 509.563 465.876, 507 467.069, 507 465.003 C 507 462.775, 499.622 455.989, 496.152 455.025 C 490.908 453.569, 481.059 453.835, 477.134 455.540 M 687.123 456.626 C 684.030 458.167, 680.954 460.641, 679.677 462.614 C 678.479 464.463, 677.163 465.981, 676.750 465.988 C 676.337 465.994, 676 463.525, 676 460.500 L 676 455 667.500 455 L 659 455 659 491 L 659 527 667.935 527 L 676.869 527 677.185 503.071 C 677.479 480.732, 677.637 478.958, 679.562 476.382 C 683.492 471.123, 686.673 469.500, 693.051 469.500 C 698.168 469.500, 699.324 469.869, 701.727 472.271 L 704.500 475.042 704.811 501.021 L 705.123 527 714.118 527 L 723.113 527 722.806 498.250 C 722.514 470.827, 722.398 469.310, 720.294 465.376 C 715.953 457.261, 709.718 454.016, 698.446 454.006 C 693.908 454.001, 691.073 454.657, 687.123 456.626 M 758.718 455.037 C 751.814 456.762, 740 464.111, 740 466.681 C 740 468.297, 746.190 477.957, 747.241 477.982 C 747.649 477.992, 749.992 476.466, 752.447 474.592 C 757.982 470.367, 762.837 468.714, 769.711 468.714 C 776.236 468.714, 779 470.784, 779 475.670 C 779 480.060, 775.194 482.449, 765.631 484.062 C 745.492 487.459, 738 493.635, 738 506.838 C 738 520.381, 746.101 528, 760.500 528 C 768.740 528, 772.668 526.374, 777.189 521.092 L 780.757 516.924 782.802 520.388 C 785.907 525.651, 789.063 527.250, 796.347 527.250 C 804.677 527.250, 806.783 526.097, 806.291 521.803 C 805.229 512.529, 805.114 512.256, 802.476 512.760 C 797.363 513.737, 797 512.366, 797 492.059 C 797 466.542, 795.401 461.793, 785 456.420 C 780.947 454.327, 764.936 453.484, 758.718 455.037 M 364.187 483.250 C 364.470 507.795, 364.748 512.023, 366.304 515.486 C 370.269 524.309, 376.521 527.944, 387.790 527.978 C 396.565 528.004, 401.119 526.016, 406.393 519.854 L 410 515.640 410 521.320 L 410 527 419 527 L 428 527 428 491 L 428 455 419.095 455 L 410.190 455 409.845 477.750 C 409.535 498.106, 409.289 500.914, 407.500 504.435 C 404.475 510.388, 400.948 512.500, 394.032 512.500 C 387.235 512.500, 384.570 510.710, 383.011 505.100 C 382.461 503.120, 382.009 491.038, 382.006 478.250 L 382 455 372.930 455 L 363.861 455 364.187 483.250 M 818 491 L 818 527 827 527 L 836 527 836 491 L 836 455 827 455 L 818 455 818 491 M 601.643 469.977 C 594.389 472.281, 591.053 478.895, 591.022 491.038 C 590.997 500.713, 593.272 506.758, 598.323 510.441 C 602.312 513.349, 611.747 513.324, 615.677 510.395 C 621.199 506.279, 622.500 502.581, 622.500 491 C 622.500 479.582, 621.178 475.690, 616 471.860 C 613.037 469.669, 605.659 468.701, 601.643 469.977 M 776.069 492.936 C 775.282 493.434, 771.761 494.385, 768.244 495.048 C 759.560 496.687, 756 499.701, 756 505.415 C 756 508.595, 756.599 510.214, 758.402 511.908 C 763.612 516.802, 773.440 514.953, 777.243 508.361 C 779.644 504.201, 780.877 491.994, 778.895 492.015 C 778.128 492.024, 776.856 492.438, 776.069 492.936" stroke="none" fill="#f8f9f9" fill-rule="evenodd"/><path d="M 0 385.001 L 0 770.002 540.250 769.751 L 1080.500 769.500 1080.751 384.750 L 1081.003 0 540.501 0 L 0 0 0 385.001 M 0.495 385.500 C 0.495 597.250, 0.610 683.726, 0.750 577.669 C 0.890 471.611, 0.890 298.361, 0.750 192.669 C 0.610 86.976, 0.495 173.750, 0.495 385.500 M 297 293.500 L 297 341 317.864 341 C 346.924 341, 355.458 339.004, 365.452 329.869 C 371.784 324.083, 375.391 317.372, 377.486 307.483 C 381.386 289.074, 377.656 270.256, 368.019 259.711 C 357.651 248.367, 349.264 246.036, 318.750 246.015 L 297 246 297 293.500 M 316 293.400 L 316 325 326.318 325 C 339.780 325, 346.104 323.159, 351.632 317.632 C 357.086 312.177, 359 305.742, 359 292.856 C 359 281.279, 356.786 274.088, 351.752 269.310 C 345.645 263.514, 342.677 262.594, 328.750 262.179 L 316 261.799 316 293.400 M 508.183 270.139 C 505.808 271.314, 502.681 273.760, 501.234 275.574 C 499.786 277.388, 498.242 278.649, 497.801 278.377 C 497.360 278.105, 497 275.884, 497 273.441 L 497 269 488.500 269 L 480 269 480 305 L 480 341 488.919 341 L 497.839 341 498.169 317.750 C 498.470 296.622, 498.687 294.143, 500.550 290.592 C 504.637 282.803, 515.634 280.548, 520.717 286.457 C 522.967 289.074, 523 289.481, 523 315.056 L 523 341 531.873 341 L 540.745 341 541.177 318.237 C 541.648 293.423, 542.392 289.896, 548.023 285.788 C 553.474 281.813, 562.575 282.656, 565.288 287.387 C 566.126 288.847, 566.600 297.454, 566.825 315.250 L 567.149 341 576.143 341 L 585.137 341 584.819 312.250 C 584.509 284.345, 584.430 283.358, 582.129 278.684 C 578.676 271.671, 573.862 268.819, 564.461 268.216 C 554.726 267.591, 549.472 269.521, 544.006 275.730 C 541.789 278.249, 539.851 280.127, 539.697 279.905 C 533.272 270.566, 528.899 268.055, 519 268.023 C 514.342 268.008, 511.277 268.607, 508.183 270.139 M 632.183 270.139 C 629.808 271.314, 626.681 273.760, 625.234 275.574 C 623.786 277.388, 622.242 278.649, 621.801 278.377 C 621.360 278.105, 621 275.884, 621 273.441 L 621 269 612.500 269 L 604 269 604 305 L 604 341 612.919 341 L 621.839 341 622.169 317.750 C 622.470 296.622, 622.687 294.143, 624.550 290.592 C 628.637 282.803, 639.634 280.548, 644.717 286.457 C 646.967 289.074, 647 289.481, 647 315.056 L 647 341 655.873 341 L 664.745 341 665.177 318.237 C 665.648 293.423, 666.392 289.896, 672.023 285.788 C 677.474 281.813, 686.575 282.656, 689.288 287.387 C 690.126 288.847, 690.600 297.454, 690.825 315.250 L 691.149 341 700.143 341 L 709.137 341 708.819 312.250 C 708.509 284.345, 708.430 283.358, 706.129 278.684 C 702.676 271.671, 697.862 268.819, 688.461 268.216 C 678.726 267.591, 673.472 269.521, 668.006 275.730 C 665.789 278.249, 663.851 280.127, 663.697 279.905 C 657.272 270.566, 652.899 268.055, 643 268.023 C 638.342 268.008, 635.277 268.607, 632.183 270.139 M 396.006 296.250 C 396.009 311.419, 396.457 325.104, 397.016 327.118 C 399.806 337.161, 406.920 342, 418.896 342 C 428.086 342, 434.011 339.468, 437.861 333.895 C 439.313 331.794, 440.837 330.059, 441.250 330.038 C 441.663 330.017, 442 332.475, 442 335.500 L 442 341 450.500 341 L 459 341 459 305 L 459 269 450.065 269 L 441.131 269 440.815 292.750 C 440.515 315.405, 440.395 316.668, 438.234 320.144 C 434.482 326.178, 425.944 328.754, 419.472 325.805 C 414.384 323.487, 414 321.258, 414 294.050 L 414 269 405 269 L 396 269 396.006 296.250 M 720 269.750 C 720 270.163, 726.354 287.018, 734.120 307.207 L 748.240 343.915 746.302 347.651 C 743.420 353.203, 740.007 355.321, 733.787 355.418 C 730.879 355.463, 727.104 355.141, 725.398 354.703 L 722.295 353.906 720.799 361.425 L 719.303 368.945 722.656 370.051 C 728.252 371.898, 741.220 371.438, 746.247 369.215 C 751.614 366.841, 756.766 361.684, 760.351 355.096 C 762.936 350.348, 793 271.956, 793 269.966 C 793 269.417, 789.172 269, 784.136 269 L 775.273 269 771.678 279.250 C 769.701 284.887, 765.766 296.137, 762.933 304.250 C 760.100 312.363, 757.440 319, 757.022 319 C 756.605 319, 752.266 307.753, 747.382 294.006 L 738.500 269.012 729.250 269.006 C 724.163 269.003, 720 269.337, 720 269.750 M 823 426.295 C 817.975 428.025, 815.287 433.678, 816.912 439.102 C 818.323 443.808, 821.975 446.455, 827.062 446.455 C 833.925 446.455, 838.333 442.366, 838.333 436 C 838.333 428.145, 831.039 423.528, 823 426.295 M 281 476.500 L 281 527 289.918 527 L 298.836 527 299.168 504.250 C 299.460 484.245, 299.732 481.033, 301.420 477.632 C 304.710 471.004, 312.705 467.696, 320.091 469.909 C 326.941 471.961, 327.385 473.818, 327.822 502.250 L 328.202 527 337.101 527 L 346 527 345.994 503.250 C 345.988 476.225, 345.190 469.450, 341.270 463.140 C 337.574 457.191, 332.480 454.629, 323.420 454.163 C 314.908 453.725, 307.642 456.366, 303.087 461.554 C 301.493 463.369, 299.921 464.588, 299.594 464.261 C 299.267 463.934, 299 455.192, 299 444.833 L 299 426 290 426 L 281 426 281 476.500 M 573 476.461 L 573 527 582 527 L 591 527 591 522.297 L 591 517.594 594.750 521.248 C 599.722 526.093, 604.623 528, 612.102 528 C 620.504 528, 625.302 526.367, 630.601 521.702 C 638.799 514.486, 642.578 502.835, 641.694 487.500 C 640.980 475.108, 638.200 467.926, 631.623 461.479 C 625.920 455.890, 621.215 454, 613 454 C 605.516 454, 600.543 455.770, 595.463 460.241 L 591.045 464.131 590.772 445.315 L 590.500 426.500 581.750 426.211 L 573 425.922 573 476.461 M 857.022 470.250 C 857.042 511.240, 857.181 514.802, 858.905 518.599 C 861.883 525.156, 866.020 527.447, 875.500 527.788 C 879.900 527.947, 884.054 527.700, 884.731 527.241 C 885.611 526.644, 885.784 524.493, 885.337 519.703 L 884.711 513 881.427 513 C 874.807 513, 875 514.350, 875 467.929 L 875 426 866 426 L 857 426 857.022 470.250 M 195 440 L 195 448 208.500 448 L 222 448 222 487.500 L 222 527 231.500 527 L 241 527 241 487.500 L 241 448 254.500 448 L 268 448 268 440 L 268 432 231.500 432 L 195 432 195 440 M 477.134 455.540 C 475.283 456.343, 472.020 458.913, 469.884 461.250 L 466 465.499 466 460.250 L 466 455 457 455 L 448 455 448 491 L 448 527 456.893 527 L 465.786 527 466.200 504.250 C 466.524 486.449, 466.956 480.721, 468.186 477.918 C 471.163 471.133, 478.480 467.683, 485.193 469.899 C 491.270 471.904, 491.461 472.809, 491.835 501.250 L 492.174 527 501.087 527 L 510 527 510.022 504.250 C 510.041 484.088, 510.259 481.025, 511.938 477.328 C 512.980 475.033, 514.978 472.405, 516.378 471.488 C 519.717 469.300, 525.793 468.557, 529.298 469.909 C 534.405 471.877, 535 475.277, 535 502.468 L 535 527 544.068 527 L 553.135 527 552.818 497.750 C 552.514 469.758, 552.404 468.321, 550.278 464.345 C 546.002 456.349, 539.822 453.492, 528.392 454.225 C 520.125 454.756, 514.144 457.825, 511.162 463.066 C 509.563 465.876, 507 467.069, 507 465.003 C 507 462.775, 499.622 455.989, 496.152 455.025 C 490.908 453.569, 481.059 453.835, 477.134 455.540 M 687.123 456.626 C 684.030 458.167, 680.954 460.641, 679.677 462.614 C 678.479 464.463, 677.163 465.981, 676.750 465.988 C 676.337 465.994, 676 463.525, 676 460.500 L 676 455 667.500 455 L 659 455 659 491 L 659 527 667.935 527 L 676.869 527 677.185 503.071 C 677.479 480.732, 677.637 478.958, 679.562 476.382 C 683.492 471.123, 686.673 469.500, 693.051 469.500 C 698.168 469.500, 699.324 469.869, 701.727 472.271 L 704.500 475.042 704.811 501.021 L 705.123 527 714.118 527 L 723.113 527 722.806 498.250 C 722.514 470.827, 722.398 469.310, 720.294 465.376 C 715.953 457.261, 709.718 454.016, 698.446 454.006 C 693.908 454.001, 691.073 454.657, 687.123 456.626 M 758.718 455.037 C 751.814 456.762, 740 464.111, 740 466.681 C 740 468.297, 746.190 477.957, 747.241 477.982 C 747.649 477.992, 749.992 476.466, 752.447 474.592 C 757.982 470.367, 762.837 468.714, 769.711 468.714 C 776.236 468.714, 779 470.784, 779 475.670 C 779 480.060, 775.194 482.449, 765.631 484.062 C 745.492 487.459, 738 493.635, 738 506.838 C 738 520.381, 746.101 528, 760.500 528 C 768.740 528, 772.668 526.374, 777.189 521.092 L 780.757 516.924 782.802 520.388 C 785.907 525.651, 789.063 527.250, 796.347 527.250 C 804.677 527.250, 806.783 526.097, 806.291 521.803 C 805.229 512.529, 805.114 512.256, 802.476 512.760 C 797.363 513.737, 797 512.366, 797 492.059 C 797 466.542, 795.401 461.793, 785 456.420 C 780.947 454.327, 764.936 453.484, 758.718 455.037 M 364.187 483.250 C 364.470 507.795, 364.748 512.023, 366.304 515.486 C 370.269 524.309, 376.521 527.944, 387.790 527.978 C 396.565 528.004, 401.119 526.016, 406.393 519.854 L 410 515.640 410 521.320 L 410 527 419 527 L 428 527 428 491 L 428 455 419.095 455 L 410.190 455 409.845 477.750 C 409.535 498.106, 409.289 500.914, 407.500 504.435 C 404.475 510.388, 400.948 512.500, 394.032 512.500 C 387.235 512.500, 384.570 510.710, 383.011 505.100 C 382.461 503.120, 382.009 491.038, 382.006 478.250 L 382 455 372.930 455 L 363.861 455 364.187 483.250 M 818 491 L 818 527 827 527 L 836 527 836 491 L 836 455 827 455 L 818 455 818 491 M 601.643 469.977 C 594.389 472.281, 591.053 478.895, 591.022 491.038 C 590.997 500.713, 593.272 506.758, 598.323 510.441 C 602.312 513.349, 611.747 513.324, 615.677 510.395 C 621.199 506.279, 622.500 502.581, 622.500 491 C 622.500 479.582, 621.178 475.690, 616 471.860 C 613.037 469.669, 605.659 468.701, 601.643 469.977 M 776.069 492.936 C 775.282 493.434, 771.761 494.385, 768.244 495.048 C 759.560 496.687, 756 499.701, 756 505.415 C 756 508.595, 756.599 510.214, 758.402 511.908 C 763.612 516.802, 773.440 514.953, 777.243 508.361 C 779.644 504.201, 780.877 491.994, 778.895 492.015 C 778.128 492.024, 776.856 492.438, 776.069 492.936" stroke="none" fill="#04645c" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/scripts/populate_sample_contributor_data_test.py b/scripts/populate_sample_contributor_data_test.py
--- a/scripts/populate_sample_contributor_data_test.py
+++ b/scripts/populate_sample_contributor_data_test.py
@@ -188,7 +188,7 @@ def _assert_can_submit_question_suggestions(self, username: str) -> None:
     def _assert_generate_sample_new_structures_data(self) -> None:
         """Asserts that the sample new structures data is generated."""
         topic_summaries = topic_fetchers.get_all_topic_summaries()
-        self.assertEqual(len(topic_summaries), 2)
+        self.assertEqual(len(topic_summaries), 1)
 
         topic = topic_fetchers.get_topic_by_name('Dummy Topic 1')
         assert topic is not None