Merge branch 'reducers_tests' into 'develop'

Reducers tests

See merge request soapbox-pub/soapbox-fe!103
merge-requests/106/head
Alex Gleason 4 years ago
commit 475881e80b

@ -0,0 +1,182 @@
{
"9w1HhmenIAKBHJiUs4":{
"header_static":"https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png",
"display_name_html":"Alex Gleason",
"bot":false,
"display_name":"Alex Gleason",
"created_at":"2020-06-12T21:47:28.000Z",
"locked":false,
"emojis":[
],
"header":"https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png",
"url":"https://gleasonator.com/users/alex",
"note":"Fediverse developer. I come in peace. <a class=\"hashtag\" data-tag=\"vegan\" href=\"https://gleasonator.com/tag/vegan\">#vegan</a> <a class=\"hashtag\" data-tag=\"freeculture\" href=\"https://gleasonator.com/tag/freeculture\">#freeculture</a> <a class=\"hashtag\" data-tag=\"atheist\" href=\"https://gleasonator.com/tag/atheist\">#atheist</a> <a class=\"hashtag\" data-tag=\"antiporn\" href=\"https://gleasonator.com/tag/antiporn\">#antiporn</a> <a class=\"hashtag\" data-tag=\"gendercritical\" href=\"https://gleasonator.com/tag/gendercritical\">#gendercritical</a>. Boosts ≠ endorsements.",
"acct":"alex@gleasonator.com",
"avatar_static":"https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg",
"username":"alex",
"avatar":"https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg",
"fields":[
{
"name":"Website",
"value":"<a href=\"https://alexgleason.me\" rel=\"ugc\">https://alexgleason.me</a>",
"name_emojified":"Website",
"value_emojified":"<a href=\"https://alexgleason.me\" rel=\"ugc\">https://alexgleason.me</a>",
"value_plain":"https://alexgleason.me"
},
{
"name":"Pleroma+Soapbox",
"value":"<a href=\"https://soapbox.pub\" rel=\"ugc\">https://soapbox.pub</a>",
"name_emojified":"Pleroma+Soapbox",
"value_emojified":"<a href=\"https://soapbox.pub\" rel=\"ugc\">https://soapbox.pub</a>",
"value_plain":"https://soapbox.pub"
},
{
"name":"Email",
"value":"alex@alexgleason.me",
"name_emojified":"Email",
"value_emojified":"alex@alexgleason.me",
"value_plain":"alex@alexgleason.me"
},
{
"name":"Gender identity",
"value":"Soyboy",
"name_emojified":"Gender identity",
"value_emojified":"Soyboy",
"value_plain":"Soyboy"
}
],
"pleroma":{
"hide_follows":false,
"hide_followers_count":false,
"background_image":null,
"confirmation_pending":false,
"is_moderator":false,
"hide_follows_count":false,
"hide_followers":false,
"relationship":{
"showing_reblogs":true,
"followed_by":false,
"subscribing":false,
"blocked_by":false,
"requested":false,
"domain_blocking":false,
"following":false,
"endorsed":false,
"blocking":false,
"muting":false,
"id":"9w1HhmenIAKBHJiUs4",
"muting_notifications":false
},
"tags":[
],
"hide_favorites":true,
"is_admin":false,
"skip_thread_containment":false
},
"source":{
"fields":[
],
"note":"Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.",
"pleroma":{
"actor_type":"Person",
"discoverable":false
},
"sensitive":false
},
"id":"9w1HhmenIAKBHJiUs4",
"note_emojified":"Fediverse developer. I come in peace. <a class=\"hashtag\" data-tag=\"vegan\" href=\"https://gleasonator.com/tag/vegan\">#vegan</a> <a class=\"hashtag\" data-tag=\"freeculture\" href=\"https://gleasonator.com/tag/freeculture\">#freeculture</a> <a class=\"hashtag\" data-tag=\"atheist\" href=\"https://gleasonator.com/tag/atheist\">#atheist</a> <a class=\"hashtag\" data-tag=\"antiporn\" href=\"https://gleasonator.com/tag/antiporn\">#antiporn</a> <a class=\"hashtag\" data-tag=\"gendercritical\" href=\"https://gleasonator.com/tag/gendercritical\">#gendercritical</a>. Boosts ≠ endorsements."
},
"9w1HhmenIAKBHJiUs5":{
"header_static":"https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png",
"display_name_html":"Alex Gleason",
"bot":false,
"display_name":"Alex Gleason",
"created_at":"2020-06-12T21:47:28.000Z",
"locked":false,
"emojis":[
],
"header":"https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png",
"url":"https://gleasonator.com/users/alex",
"note":"Fediverse developer. I come in peace. <a class=\"hashtag\" data-tag=\"vegan\" href=\"https://gleasonator.com/tag/vegan\">#vegan</a> <a class=\"hashtag\" data-tag=\"freeculture\" href=\"https://gleasonator.com/tag/freeculture\">#freeculture</a> <a class=\"hashtag\" data-tag=\"atheist\" href=\"https://gleasonator.com/tag/atheist\">#atheist</a> <a class=\"hashtag\" data-tag=\"antiporn\" href=\"https://gleasonator.com/tag/antiporn\">#antiporn</a> <a class=\"hashtag\" data-tag=\"gendercritical\" href=\"https://gleasonator.com/tag/gendercritical\">#gendercritical</a>. Boosts ≠ endorsements.",
"acct":"alex@gleasonator.com",
"avatar_static":"https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg",
"username":"alex",
"avatar":"https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg",
"fields":[
{
"name":"Website",
"value":"<a href=\"https://alexgleason.me\" rel=\"ugc\">https://alexgleason.me</a>",
"name_emojified":"Website",
"value_emojified":"<a href=\"https://alexgleason.me\" rel=\"ugc\">https://alexgleason.me</a>",
"value_plain":"https://alexgleason.me"
},
{
"name":"Pleroma+Soapbox",
"value":"<a href=\"https://soapbox.pub\" rel=\"ugc\">https://soapbox.pub</a>",
"name_emojified":"Pleroma+Soapbox",
"value_emojified":"<a href=\"https://soapbox.pub\" rel=\"ugc\">https://soapbox.pub</a>",
"value_plain":"https://soapbox.pub"
},
{
"name":"Email",
"value":"alex@alexgleason.me",
"name_emojified":"Email",
"value_emojified":"alex@alexgleason.me",
"value_plain":"alex@alexgleason.me"
},
{
"name":"Gender identity",
"value":"Soyboy",
"name_emojified":"Gender identity",
"value_emojified":"Soyboy",
"value_plain":"Soyboy"
}
],
"pleroma":{
"hide_follows":false,
"hide_followers_count":false,
"background_image":null,
"confirmation_pending":false,
"is_moderator":false,
"hide_follows_count":false,
"hide_followers":false,
"relationship":{
"showing_reblogs":true,
"followed_by":false,
"subscribing":false,
"blocked_by":false,
"requested":false,
"domain_blocking":false,
"following":false,
"endorsed":false,
"blocking":false,
"muting":false,
"id":"9w1HhmenIAKBHJiUs5",
"muting_notifications":false
},
"tags":[
],
"hide_favorites":true,
"is_admin":false,
"skip_thread_containment":false
},
"source":{
"fields":[
],
"note":"Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.",
"pleroma":{
"actor_type":"Person",
"discoverable":false
},
"sensitive":false
},
"id":"9w1HhmenIAKBHJiUs5",
"note_emojified":"Fediverse developer. I come in peace. <a class=\"hashtag\" data-tag=\"vegan\" href=\"https://gleasonator.com/tag/vegan\">#vegan</a> <a class=\"hashtag\" data-tag=\"freeculture\" href=\"https://gleasonator.com/tag/freeculture\">#freeculture</a> <a class=\"hashtag\" data-tag=\"atheist\" href=\"https://gleasonator.com/tag/atheist\">#atheist</a> <a class=\"hashtag\" data-tag=\"antiporn\" href=\"https://gleasonator.com/tag/antiporn\">#antiporn</a> <a class=\"hashtag\" data-tag=\"gendercritical\" href=\"https://gleasonator.com/tag/gendercritical\">#gendercritical</a>. Boosts ≠ endorsements."
}
}

@ -0,0 +1,7 @@
{
"9vMAje101ngtjlMj7w": {
"followers_count": 2,
"following_count": 3,
"statuses_count": 2
}
}

@ -0,0 +1,7 @@
{
"9vMAje101ngtjlMj7w": {
"followers_count": 2,
"following_count": 2,
"statuses_count": 2
}
}

@ -0,0 +1,7 @@
{
"9vMAje101ngtjlMj7w": {
"followers_count": 2,
"following_count": 1,
"statuses_count": 2
}
}

@ -0,0 +1,15 @@
{
"vapid_key": "BHczIFh4Wn3Q_7wDgehaB8Ti3Uu8BoyOgXxkOVuEJRuEqxtd9TAno8K9ycz4myiQ1ruiyVfG6xT1JLeXtpxDzUs",
"token_type": "Bearer",
"client_secret": "cm_8Zip_UYyYq1DPQ-CRFUolrz894MmWYUC0aeVcklM",
"redirect_uri": "urn:ietf:wg:oauth:2.0:oob",
"created_at": 1594764335,
"name": "SoapboxFE_2020-07-14T22:05:17.054Z",
"client_id": "bjiy8AxGKXXesfZcyp_iN-uQVE6Cnl03efWoSdOPh9M",
"expires_in": 600,
"scope": "read write follow push admin",
"refresh_token": "IXoCKCsZi3ZCuCjIkeadvEoHRdqOYHklZmv9jvkJ5VA",
"website": null,
"id": "134",
"access_token": "XSkQFSV1R_IvycQmw_uD5z6hQmNyuhh9PtMQbv8TgG8"
}

@ -0,0 +1,956 @@
{
"default": {
"account.add_or_remove_from_list": "Add or Remove from lists",
"account.badges.bot": "Bot",
"account.block": "Block @{name}",
"account.block_domain": "Hide everything from {domain}",
"account.blocked": "Blocked",
"account.direct": "Direct message @{name}",
"account.domain_blocked": "Domain hidden",
"account.edit_profile": "Edit profile",
"account.endorse": "Feature on profile",
"account.follow": "Follow",
"account.followers": "Followers",
"account.followers.empty": "No one follows this user yet.",
"account.follows": "Follows",
"account.follows.empty": "This user doesn\"t follow anyone yet.",
"account.follows_you": "Follows you",
"account.hide_reblogs": "Hide reposts from @{name}",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.login": "Log in",
"account.media": "Media",
"account.member_since": "Member since {date}",
"account.mention": "Mention",
"account.message": "Message",
"account.moved_to": "{name} has moved to:",
"account.mute": "Mute @{name}",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Muted",
"account.posts": "Posts",
"account.posts_with_replies": "Posts and replies",
"account.profile": "Profile",
"account.register": "Sign up",
"account.report": "Report @{name}",
"account.requested": "Awaiting approval. Click to cancel follow request",
"account.share": "Share @{name}\"s profile",
"account.show_reblogs": "Show reposts from @{name}",
"account.unblock": "Unblock @{name}",
"account.unblock_domain": "Unhide {domain}",
"account.unendorse": "Don\"t feature on profile",
"account.unfollow": "Unfollow",
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
"account_gallery.none": "No media to show.",
"alert.unexpected.message": "An unexpected error occurred.",
"alert.unexpected.title": "Oops!",
"audio.close": "Close audio",
"audio.expand": "Expand audio",
"audio.hide": "Hide audio",
"audio.mute": "Mute",
"audio.pause": "Pause",
"audio.play": "Play",
"audio.unmute": "Unmute",
"boost_modal.combo": "You can press {combo} to skip this next time",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",
"bundle_column_error.title": "Network error",
"bundle_modal_error.close": "Close",
"bundle_modal_error.message": "Something went wrong while loading this component.",
"bundle_modal_error.retry": "Try again",
"column.blocks": "Blocked users",
"column.community": "Local timeline",
"column.direct": "Direct messages",
"column.domain_blocks": "Hidden domains",
"column.edit_profile": "Edit profile",
"column.filters": "Muted words",
"column.follow_requests": "Follow requests",
"column.groups": "Groups",
"column.home": "Home",
"column.lists": "Lists",
"column.mutes": "Muted users",
"column.notifications": "Notifications",
"column.preferences": "Preferences",
"column.public": "Federated timeline",
"column.security": "Security",
"column_back_button.label": "Back",
"column_header.hide_settings": "Hide settings",
"column_header.show_settings": "Show settings",
"column_subheading.settings": "Settings",
"community.column_settings.media_only": "Media Only",
"compose_form.direct_message_warning": "This post will only be sent to the mentioned users.",
"compose_form.direct_message_warning_learn_more": "Learn more",
"compose_form.hashtag_warning": "This post won\"t be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
"compose_form.placeholder": "What\"s on your mind?",
"compose_form.poll.add_option": "Add a choice",
"compose_form.poll.duration": "Poll duration",
"compose_form.poll.option_placeholder": "Choice {number}",
"compose_form.poll.remove_option": "Remove this choice",
"compose_form.poll.type.hint": "Click to toggle poll type. Radio button (default) is single. Checkbox is multiple.",
"compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive.hide": "Mark media as sensitive",
"compose_form.sensitive.marked": "Media is marked as sensitive",
"compose_form.sensitive.unmarked": "Media is not marked as sensitive",
"compose_form.spoiler.marked": "Text is hidden behind warning",
"compose_form.spoiler.unmarked": "Text is not hidden",
"compose_form.spoiler_placeholder": "Write your warning here",
"confirmation_modal.cancel": "Cancel",
"confirmations.block.block_and_report": "Block & Report",
"confirmations.block.confirm": "Block",
"confirmations.block.message": "Are you sure you want to block {name}?",
"confirmations.delete.confirm": "Delete",
"confirmations.delete.message": "Are you sure you want to delete this post?",
"confirmations.delete_list.confirm": "Delete",
"confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
"confirmations.domain_block.confirm": "Hide entire domain",
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
"confirmations.mute.confirm": "Mute",
"confirmations.mute.message": "Are you sure you want to mute {name}?",
"confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favorites and reposts will be lost, and replies to the original post will be orphaned.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Unfollow",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"donate": "Donate",
"edit_profile.fields.avatar_label": "Avatar",
"edit_profile.fields.bio_label": "Bio",
"edit_profile.fields.bot_label": "This is a bot account",
"edit_profile.fields.display_name_label": "Display name",
"edit_profile.fields.header_label": "Header",
"edit_profile.fields.locked_label": "Lock account",
"edit_profile.fields.meta_fields.content_placeholder": "Content",
"edit_profile.fields.meta_fields.label_placeholder": "Label",
"edit_profile.fields.meta_fields_label": "Profile metadata",
"edit_profile.hints.avatar": "PNG, GIF or JPG. At most 2 MB. Will be downscaled to 400x400px",
"edit_profile.hints.bot": "This account mainly performs automated actions and might not be monitored",
"edit_profile.hints.header": "PNG, GIF or JPG. At most 2 MB. Will be downscaled to 1500x500px",
"edit_profile.hints.locked": "Requires you to manually approve followers",
"edit_profile.hints.meta_fields": "You can have up to {count, plural, one {# item} other {# items}} displayed as a table on your profile",
"edit_profile.save": "Save",
"embed.instructions": "Embed this post on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
"emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
"emoji_button.label": "Insert emoji",
"emoji_button.nature": "Nature",
"emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objects",
"emoji_button.people": "People",
"emoji_button.recent": "Frequently used",
"emoji_button.search": "Search...",
"emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symbols",
"emoji_button.travel": "Travel & Places",
"empty_column.account_timeline": "No posts here!",
"empty_column.account_unavailable": "Profile unavailable",
"empty_column.blocks": "You haven\"t blocked any users yet.",
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
"empty_column.direct": "You don\"t have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no hidden domains yet.",
"empty_column.favourited_statuses": "You don\"t have any liked posts yet. When you like one, it will show up here.",
"empty_column.favourites": "No one has liked this post yet. When someone does, they will show up here.",
"empty_column.filters": "You haven\"t created any muted words yet.",
"empty_column.follow_requests": "You don\"t have any follow requests yet. When you receive one, it will show up here.",
"empty_column.group": "There is nothing in this group yet. When members of this group make new posts, they will appear here.",
"empty_column.hashtag": "There is nothing in this hashtag yet.",
"empty_column.home": "Your home timeline is empty! Visit {public} to get started and meet other users.",
"empty_column.home.local_tab": "the {site_title} tab",
"empty_column.list": "There is nothing in this list yet. When members of this list create new posts, they will appear here.",
"empty_column.lists": "You don\"t have any lists yet. When you create one, it will show up here.",
"empty_column.mutes": "You haven\"t muted any users yet.",
"empty_column.notifications": "You don\"t have any notifications yet. Interact with others to start the conversation.",
"empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
"fediverse_tab.explanation_box.explanation": "{site_title} is part of the Fediverse, a social network made up of thousands of independent social media sites (aka 'servers'). The posts you see here are from 3rd-party servers. You have the freedom to engage with them, or to block any server you don\"t like. Pay attention to the full username after the second @ symbol to know which server a post is from. To see only {site_title} posts, visit {local}.",
"fediverse_tab.explanation_box.title": "What is the Fediverse?",
"follow_request.authorize": "Authorize",
"follow_request.reject": "Reject",
"getting_started.heading": "Getting started",
"getting_started.open_source_notice": "{code_name} is open source software. You can contribute or report issues at {code_link} (v{code_version}).",
"group.members.empty": "This group does not has any members.",
"group.removed_accounts.empty": "This group does not has any removed accounts.",
"groups.card.join": "Join",
"groups.card.members": "Members",
"groups.card.roles.admin": "You\"re an admin",
"groups.card.roles.member": "You\"re a member",
"groups.card.view": "View",
"groups.create": "Create group",
"groups.form.coverImage": "Upload new banner image (optional)",
"groups.form.coverImageChange": "Banner image selected",
"groups.form.create": "Create group",
"groups.form.description": "Description",
"groups.form.title": "Title",
"groups.form.update": "Update group",
"groups.removed_accounts": "Removed Accounts",
"groups.tab_admin": "Manage",
"groups.tab_featured": "Featured",
"groups.tab_member": "Member",
"hashtag.column_header.tag_mode.all": "and {additional}",
"hashtag.column_header.tag_mode.any": "or {additional}",
"hashtag.column_header.tag_mode.none": "without {additional}",
"home.column_settings.basic": "Basic",
"home.column_settings.show_reblogs": "Show reposts",
"home.column_settings.show_replies": "Show replies",
"home_column.lists": "Lists",
"home_column_header.fediverse": "Fediverse",
"home_column_header.home": "Home",
"intervals.full.days": "{number, plural, one {# day} other {# days}}",
"intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
"intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
"keyboard_shortcuts.back": "to navigate back",
"keyboard_shortcuts.blocked": "to open blocked users list",
"keyboard_shortcuts.boost": "to repost",
"keyboard_shortcuts.column": "to focus a post in one of the columns",
"keyboard_shortcuts.compose": "to focus the compose textarea",
"keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "to move down in the list",
"keyboard_shortcuts.enter": "to open post",
"keyboard_shortcuts.favourite": "to like",
"keyboard_shortcuts.favourites": "to open likes list",
"keyboard_shortcuts.heading": "Keyboard shortcuts",
"keyboard_shortcuts.home": "to open home timeline",
"keyboard_shortcuts.hotkey": "Hotkey",
"keyboard_shortcuts.legend": "to display this legend",
"keyboard_shortcuts.mention": "to mention author",
"keyboard_shortcuts.muted": "to open muted users list",
"keyboard_shortcuts.my_profile": "to open your profile",
"keyboard_shortcuts.notifications": "to open notifications column",
"keyboard_shortcuts.pinned": "to open pinned posts list",
"keyboard_shortcuts.profile": "to open author\"s profile",
"keyboard_shortcuts.reply": "to reply",
"keyboard_shortcuts.requests": "to open follow requests list",
"keyboard_shortcuts.search": "to focus search",
"keyboard_shortcuts.start": "to open 'get started' column",
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
"keyboard_shortcuts.toot": "to start a new post",
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
"keyboard_shortcuts.up": "to move up in the list",
"lightbox.close": "Close",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
"lightbox.view_context": "View context",
"list.click_to_add": "Click here to add people",
"list_adder.header_title": "Add or Remove from Lists",
"lists.account.add": "Add to list",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
"lists.edit": "Edit list",
"lists.edit.submit": "Change title",
"lists.new.create": "Add list",
"lists.new.create_title": "Create",
"lists.new.save_title": "Save Title",
"lists.new.title_placeholder": "New list title",
"lists.search": "Search among people you follow",
"lists.subheading": "Your lists",
"lists.view_all": "View all lists",
"loading_indicator.label": "Loading...",
"login.fields.password_placeholder": "Password",
"login.fields.username_placeholder": "Username",
"login.log_in": "Log in",
"login.reset_password_hint": "Trouble logging in?",
"media_gallery.toggle_visible": "Toggle visibility",
"missing_indicator.label": "Not found",
"missing_indicator.sublabel": "This resource could not be found",
"morefollows.followers_label": "…and {count} more {count, plural, one {follower} other {followers}} on remote sites.",
"morefollows.following_label": "…and {count} more {count, plural, one {follow} other {follows}} on remote sites.",
"mute_modal.hide_notifications": "Hide notifications from this user?",
"navigation_bar.admin_settings": "Admin settings",
"navigation_bar.blocks": "Blocked users",
"navigation_bar.community_timeline": "Local timeline",
"navigation_bar.compose": "Compose new post",
"navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Edit profile",
"navigation_bar.favourites": "Likes",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Follow requests",
"navigation_bar.info": "About this server",
"navigation_bar.keyboard_shortcuts": "Hotkeys",
"navigation_bar.lists": "Lists",
"navigation_bar.logout": "Logout",
"navigation_bar.messages": "Messages",
"navigation_bar.mutes": "Muted users",
"navigation_bar.personal": "Personal",
"navigation_bar.pins": "Pinned posts",
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
"notification.emoji_react": "{name} reacted to your post",
"notification.favourite": "{name} liked your post",
"notification.follow": "{name} followed you",
"notification.mention": "{name} mentioned you",
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} reposted your post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Likes:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
"notifications.column_settings.filter_bar.show": "Show",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.mention": "Mentions:",
"notifications.column_settings.poll": "Poll results:",
"notifications.column_settings.push": "Push notifications",
"notifications.column_settings.reblog": "Reposts:",
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Reposts",
"notifications.filter.favourites": "Likes",
"notifications.filter.follows": "Follows",
"notifications.filter.mentions": "Mentions",
"notifications.filter.polls": "Poll results",
"notifications.group": "{count} notifications",
"notifications.queue_label": "Click to see {count} new {count, plural, one {notification} other {notifications}}",
"pinned_statuses.none": "No pins to show.",
"poll.closed": "Closed",
"poll.refresh": "Refresh",
"poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
"poll.vote": "Vote",
"poll_button.add_poll": "Add a poll",
"poll_button.remove_poll": "Remove poll",
"preferences.fields.auto_play_gif_label": "Auto-play animated GIFs",
"preferences.fields.boost_modal_label": "Show confirmation dialog before reposting",
"preferences.fields.delete_modal_label": "Show confirmation dialog before deleting a post",
"preferences.fields.demetricator_label": "Use Demetricator",
"preferences.fields.dyslexic_font_label": "Dyslexic mode",
"preferences.fields.expand_spoilers_label": "Always expand posts marked with content warnings",
"preferences.fields.language_label": "Language",
"preferences.fields.privacy_label": "Post privacy",
"preferences.fields.reduce_motion_label": "Reduce motion in animations",
"preferences.fields.system_font_label": "Use system\"s default font",
"preferences.fields.theme_label": "Theme",
"preferences.fields.unfollow_modal_label": "Show confirmation dialog before unfollowing someone",
"preferences.hints.demetricator": "Decrease social media anxiety by hiding all numbers from the site.",
"preferences.hints.privacy_followers_only": "Only show to followers",
"preferences.hints.privacy_public": "Everyone can see",
"preferences.hints.privacy_unlisted": "Everyone can see, but not listed on public timelines",
"preferences.options.privacy_followers_only": "Followers-only",
"preferences.options.privacy_public": "Public",
"preferences.options.privacy_unlisted": "Unlisted",
"preferences.options.theme_dark": "Dark",
"preferences.options.theme_light": "Light",
"privacy.change": "Adjust post privacy",
"privacy.direct.long": "Post to mentioned users only",
"privacy.direct.short": "Direct",
"privacy.private.long": "Post to followers only",
"privacy.private.short": "Followers-only",
"privacy.public.long": "Post to public timelines",
"privacy.public.short": "Public",
"privacy.unlisted.long": "Do not post to public timelines",
"privacy.unlisted.short": "Unlisted",
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"registration.agreement": "I agree to the {tos}.",
"registration.fields.confirm_placeholder": "Password (again)",
"registration.fields.email_placeholder": "E-Mail address",
"registration.fields.password_placeholder": "Password",
"registration.fields.username_placeholder": "Username",
"registration.lead": "With an account on {instance} you\"ll be able to follow people on any server in the fediverse.",
"registration.sign_up": "Sign up",
"registration.tos": "Terms of Service",
"relative_time.days": "{number}d",
"relative_time.hours": "{number}h",
"relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"reply_indicator.cancel": "Cancel",
"report.block": "Block {target}",
"report.block_hint": "Do you also want to block this account?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
"report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
"report.placeholder": "Additional comments",
"report.submit": "Submit",
"report.target": "Reporting {target}",
"search.placeholder": "Search",
"search_popout.search_format": "Advanced search format",
"search_popout.tips.full_text": "Simple text returns posts you have written, favorited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
"search_popout.tips.hashtag": "hashtag",
"search_popout.tips.status": "post",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
"search_results.hashtags": "Hashtags",
"search_results.statuses": "Posts",
"search_results.top": "Top",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
"security.fields.email.label": "Email address",
"security.fields.new_password.label": "New password",
"security.fields.old_password.label": "Current password",
"security.fields.password.label": "Password",
"security.fields.password_confirmation.label": "New password (again)",
"security.headers.tokens": "Sessions",
"security.headers.update_email": "Change Email",
"security.headers.update_password": "Change Password",
"security.submit": "Save changes",
"security.tokens.revoke": "Revoke",
"security.update_email.fail": "Update email failed.",
"security.update_email.success": "Email successfully updated.",
"security.update_password.fail": "Update password failed.",
"security.update_password.success": "Password successfully updated.",
"signup_panel.subtitle": "Sign up now to discuss.",
"signup_panel.title": "New to {site_title}?",
"status.admin_account": "Open moderation interface for @{name}",
"status.admin_status": "Open this post in the moderation interface",
"status.block": "Block @{name}",
"status.cancel_reblog_private": "Un-repost",
"status.cannot_reblog": "This post cannot be reposted",
"status.copy": "Copy link to post",
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
"status.embed": "Embed",
"status.favourite": "Like",
"status.filtered": "Filtered",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
"status.more": "More",
"status.mute": "Mute @{name}",
"status.mute_conversation": "Mute conversation",
"status.open": "Expand this post",
"status.pin": "Pin on profile",
"status.pinned": "Pinned post",
"status.read_more": "Read more",
"status.reblog": "Repost",
"status.reblog_private": "Repost to original audience",
"status.reblogged_by": "{name} reposted",
"status.reblogs.empty": "No one has reposted this post yet. When someone does, they will show up here.",
"status.redraft": "Delete & re-draft",
"status.remove_account_from_group": "Remove account from group",
"status.remove_post_from_group": "Remove post from group",
"status.reply": "Reply",
"status.replyAll": "Reply to thread",
"status.report": "Report @{name}",
"status.sensitive_warning": "Sensitive content",
"status.share": "Share",
"status.show_less": "Show less",
"status.show_less_all": "Show less for all",
"status.show_more": "Show more",
"status.show_more_all": "Show more for all",
"status.show_thread": "Show thread",
"status.unmute_conversation": "Unmute conversation",
"status.unpin": "Unpin from profile",
"status_list.queue_label": "Click to see {count} new {count, plural, one {post} other {posts}}",
"suggestions.dismiss": "Dismiss suggestion",
"tabs_bar.apps": "Apps",
"tabs_bar.home": "Home",
"tabs_bar.news": "News",
"tabs_bar.notifications": "Notifications",
"tabs_bar.post": "Post",
"tabs_bar.search": "Search",
"time_remaining.days": "{number, plural, one {# day} other {# days}} left",
"time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
"time_remaining.moments": "Moments remaining",
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
"trends.title": "Trends",
"ui.beforeunload": "Your draft will be lost if you leave.",
"unauthorized_modal.footer": "Already have an account? {login}.",
"unauthorized_modal.text": "You need to be logged in to do that.",
"unauthorized_modal.title": "Sign up for {site_title}",
"upload_area.title": "Drag & drop to upload",
"upload_button.label": "Add media attachment",
"upload_error.limit": "File upload limit exceeded.",
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.description": "Describe for the visually impaired",
"upload_form.focus": "Change preview",
"upload_form.undo": "Delete",
"upload_progress.label": "Uploading...",
"video.close": "Close video",
"video.exit_fullscreen": "Exit full screen",
"video.expand": "Expand video",
"video.fullscreen": "Full screen",
"video.hide": "Hide video",
"video.mute": "Mute sound",
"video.pause": "Pause",
"video.play": "Play",
"video.unmute": "Unmute sound",
"who_to_follow.title": "Who To Follow"
},
"account.add_or_remove_from_list": "Add or Remove from lists",
"account.badges.bot": "Bot",
"account.block": "Block @{name}",
"account.block_domain": "Hide everything from {domain}",
"account.blocked": "Blocked",
"account.direct": "Direct message @{name}",
"account.domain_blocked": "Domain hidden",
"account.edit_profile": "Edit profile",
"account.endorse": "Feature on profile",
"account.follow": "Follow",
"account.followers": "Followers",
"account.followers.empty": "No one follows this user yet.",
"account.follows": "Follows",
"account.follows.empty": "This user doesn\"t follow anyone yet.",
"account.follows_you": "Follows you",
"account.hide_reblogs": "Hide reposts from @{name}",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
"account.login": "Log in",
"account.media": "Media",
"account.member_since": "Member since {date}",
"account.mention": "Mention",
"account.message": "Message",
"account.moved_to": "{name} has moved to:",
"account.mute": "Mute @{name}",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Muted",
"account.posts": "Posts",
"account.posts_with_replies": "Posts and replies",
"account.profile": "Profile",
"account.register": "Sign up",
"account.report": "Report @{name}",
"account.requested": "Awaiting approval. Click to cancel follow request",
"account.share": "Share @{name}\"s profile",
"account.show_reblogs": "Show reposts from @{name}",
"account.unblock": "Unblock @{name}",
"account.unblock_domain": "Unhide {domain}",
"account.unendorse": "Don\"t feature on profile",
"account.unfollow": "Unfollow",
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
"account_gallery.none": "No media to show.",
"alert.unexpected.message": "An unexpected error occurred.",
"alert.unexpected.title": "Oops!",
"audio.close": "Close audio",
"audio.expand": "Expand audio",
"audio.hide": "Hide audio",
"audio.mute": "Mute",
"audio.pause": "Pause",
"audio.play": "Play",
"audio.unmute": "Unmute",
"boost_modal.combo": "You can press {combo} to skip this next time",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",
"bundle_column_error.title": "Network error",
"bundle_modal_error.close": "Close",
"bundle_modal_error.message": "Something went wrong while loading this component.",
"bundle_modal_error.retry": "Try again",
"column.blocks": "Blocked users",
"column.community": "Local timeline",
"column.direct": "Direct messages",
"column.domain_blocks": "Hidden domains",
"column.edit_profile": "Edit profile",
"column.filters": "Muted words",
"column.follow_requests": "Follow requests",
"column.groups": "Groups",
"column.home": "Home",
"column.lists": "Lists",
"column.mutes": "Muted users",
"column.notifications": "Notifications",
"column.preferences": "Preferences",
"column.public": "Federated timeline",
"column.security": "Security",
"column_back_button.label": "Back",
"column_header.hide_settings": "Hide settings",
"column_header.show_settings": "Show settings",
"column_subheading.settings": "Settings",
"community.column_settings.media_only": "Media Only",
"compose_form.direct_message_warning": "This post will only be sent to the mentioned users.",
"compose_form.direct_message_warning_learn_more": "Learn more",
"compose_form.hashtag_warning": "This post won\"t be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
"compose_form.placeholder": "What\"s on your mind?",
"compose_form.poll.add_option": "Add a choice",
"compose_form.poll.duration": "Poll duration",
"compose_form.poll.option_placeholder": "Choice {number}",
"compose_form.poll.remove_option": "Remove this choice",
"compose_form.poll.type.hint": "Click to toggle poll type. Radio button (default) is single. Checkbox is multiple.",
"compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive.hide": "Mark media as sensitive",
"compose_form.sensitive.marked": "Media is marked as sensitive",
"compose_form.sensitive.unmarked": "Media is not marked as sensitive",
"compose_form.spoiler.marked": "Text is hidden behind warning",
"compose_form.spoiler.unmarked": "Text is not hidden",
"compose_form.spoiler_placeholder": "Write your warning here",
"confirmation_modal.cancel": "Cancel",
"confirmations.block.block_and_report": "Block & Report",
"confirmations.block.confirm": "Block",
"confirmations.block.message": "Are you sure you want to block {name}?",
"confirmations.delete.confirm": "Delete",
"confirmations.delete.message": "Are you sure you want to delete this post?",
"confirmations.delete_list.confirm": "Delete",
"confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
"confirmations.domain_block.confirm": "Hide entire domain",
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
"confirmations.mute.confirm": "Mute",
"confirmations.mute.message": "Are you sure you want to mute {name}?",
"confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favorites and reposts will be lost, and replies to the original post will be orphaned.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Unfollow",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"donate": "Donate",
"edit_profile.fields.avatar_label": "Avatar",
"edit_profile.fields.bio_label": "Bio",
"edit_profile.fields.bot_label": "This is a bot account",
"edit_profile.fields.display_name_label": "Display name",
"edit_profile.fields.header_label": "Header",
"edit_profile.fields.locked_label": "Lock account",
"edit_profile.fields.meta_fields.content_placeholder": "Content",
"edit_profile.fields.meta_fields.label_placeholder": "Label",
"edit_profile.fields.meta_fields_label": "Profile metadata",
"edit_profile.hints.avatar": "PNG, GIF or JPG. At most 2 MB. Will be downscaled to 400x400px",
"edit_profile.hints.bot": "This account mainly performs automated actions and might not be monitored",
"edit_profile.hints.header": "PNG, GIF or JPG. At most 2 MB. Will be downscaled to 1500x500px",
"edit_profile.hints.locked": "Requires you to manually approve followers",
"edit_profile.hints.meta_fields": "You can have up to {count, plural, one {# item} other {# items}} displayed as a table on your profile",
"edit_profile.save": "Save",
"embed.instructions": "Embed this post on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
"emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
"emoji_button.label": "Insert emoji",
"emoji_button.nature": "Nature",
"emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objects",
"emoji_button.people": "People",
"emoji_button.recent": "Frequently used",
"emoji_button.search": "Search...",
"emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symbols",
"emoji_button.travel": "Travel & Places",
"empty_column.account_timeline": "No posts here!",
"empty_column.account_unavailable": "Profile unavailable",
"empty_column.blocks": "You haven\"t blocked any users yet.",
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
"empty_column.direct": "You don\"t have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no hidden domains yet.",
"empty_column.favourited_statuses": "You don\"t have any liked posts yet. When you like one, it will show up here.",
"empty_column.favourites": "No one has liked this post yet. When someone does, they will show up here.",
"empty_column.filters": "You haven\"t created any muted words yet.",
"empty_column.follow_requests": "You don\"t have any follow requests yet. When you receive one, it will show up here.",
"empty_column.group": "There is nothing in this group yet. When members of this group make new posts, they will appear here.",
"empty_column.hashtag": "There is nothing in this hashtag yet.",
"empty_column.home": "Your home timeline is empty! Visit {public} to get started and meet other users.",
"empty_column.home.local_tab": "the {site_title} tab",
"empty_column.list": "There is nothing in this list yet. When members of this list create new posts, they will appear here.",
"empty_column.lists": "You don\"t have any lists yet. When you create one, it will show up here.",
"empty_column.mutes": "You haven\"t muted any users yet.",
"empty_column.notifications": "You don\"t have any notifications yet. Interact with others to start the conversation.",
"empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
"fediverse_tab.explanation_box.explanation": "{site_title} is part of the Fediverse, a social network made up of thousands of independent social media sites (aka 'servers'). The posts you see here are from 3rd-party servers. You have the freedom to engage with them, or to block any server you don\"t like. Pay attention to the full username after the second @ symbol to know which server a post is from. To see only {site_title} posts, visit {local}.",
"fediverse_tab.explanation_box.title": "What is the Fediverse?",
"follow_request.authorize": "Authorize",
"follow_request.reject": "Reject",
"getting_started.heading": "Getting started",
"getting_started.open_source_notice": "{code_name} is open source software. You can contribute or report issues at {code_link} (v{code_version}).",
"group.members.empty": "This group does not has any members.",
"group.removed_accounts.empty": "This group does not has any removed accounts.",
"groups.card.join": "Join",
"groups.card.members": "Members",
"groups.card.roles.admin": "You\"re an admin",
"groups.card.roles.member": "You\"re a member",
"groups.card.view": "View",
"groups.create": "Create group",
"groups.form.coverImage": "Upload new banner image (optional)",
"groups.form.coverImageChange": "Banner image selected",
"groups.form.create": "Create group",
"groups.form.description": "Description",
"groups.form.title": "Title",
"groups.form.update": "Update group",
"groups.removed_accounts": "Removed Accounts",
"groups.tab_admin": "Manage",
"groups.tab_featured": "Featured",
"groups.tab_member": "Member",
"hashtag.column_header.tag_mode.all": "and {additional}",
"hashtag.column_header.tag_mode.any": "or {additional}",
"hashtag.column_header.tag_mode.none": "without {additional}",
"home.column_settings.basic": "Basic",
"home.column_settings.show_reblogs": "Show reposts",
"home.column_settings.show_replies": "Show replies",
"home_column.lists": "Lists",
"home_column_header.fediverse": "Fediverse",
"home_column_header.home": "Home",
"intervals.full.days": "{number, plural, one {# day} other {# days}}",
"intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
"intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
"keyboard_shortcuts.back": "to navigate back",
"keyboard_shortcuts.blocked": "to open blocked users list",
"keyboard_shortcuts.boost": "to repost",
"keyboard_shortcuts.column": "to focus a post in one of the columns",
"keyboard_shortcuts.compose": "to focus the compose textarea",
"keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "to move down in the list",
"keyboard_shortcuts.enter": "to open post",
"keyboard_shortcuts.favourite": "to like",
"keyboard_shortcuts.favourites": "to open likes list",
"keyboard_shortcuts.heading": "Keyboard shortcuts",
"keyboard_shortcuts.home": "to open home timeline",
"keyboard_shortcuts.hotkey": "Hotkey",
"keyboard_shortcuts.legend": "to display this legend",
"keyboard_shortcuts.mention": "to mention author",
"keyboard_shortcuts.muted": "to open muted users list",
"keyboard_shortcuts.my_profile": "to open your profile",
"keyboard_shortcuts.notifications": "to open notifications column",
"keyboard_shortcuts.pinned": "to open pinned posts list",
"keyboard_shortcuts.profile": "to open author\"s profile",
"keyboard_shortcuts.reply": "to reply",
"keyboard_shortcuts.requests": "to open follow requests list",
"keyboard_shortcuts.search": "to focus search",
"keyboard_shortcuts.start": "to open 'get started' column",
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
"keyboard_shortcuts.toot": "to start a new post",
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
"keyboard_shortcuts.up": "to move up in the list",
"lightbox.close": "Close",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
"lightbox.view_context": "View context",
"list.click_to_add": "Click here to add people",
"list_adder.header_title": "Add or Remove from Lists",
"lists.account.add": "Add to list",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
"lists.edit": "Edit list",
"lists.edit.submit": "Change title",
"lists.new.create": "Add list",
"lists.new.create_title": "Create",
"lists.new.save_title": "Save Title",
"lists.new.title_placeholder": "New list title",
"lists.search": "Search among people you follow",
"lists.subheading": "Your lists",
"lists.view_all": "View all lists",
"loading_indicator.label": "Loading...",
"login.fields.password_placeholder": "Password",
"login.fields.username_placeholder": "Username",
"login.log_in": "Log in",
"login.reset_password_hint": "Trouble logging in?",
"media_gallery.toggle_visible": "Toggle visibility",
"missing_indicator.label": "Not found",
"missing_indicator.sublabel": "This resource could not be found",
"morefollows.followers_label": "…and {count} more {count, plural, one {follower} other {followers}} on remote sites.",
"morefollows.following_label": "…and {count} more {count, plural, one {follow} other {follows}} on remote sites.",
"mute_modal.hide_notifications": "Hide notifications from this user?",
"navigation_bar.admin_settings": "Admin settings",
"navigation_bar.blocks": "Blocked users",
"navigation_bar.community_timeline": "Local timeline",
"navigation_bar.compose": "Compose new post",
"navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Edit profile",
"navigation_bar.favourites": "Likes",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Follow requests",
"navigation_bar.info": "About this server",
"navigation_bar.keyboard_shortcuts": "Hotkeys",
"navigation_bar.lists": "Lists",
"navigation_bar.logout": "Logout",
"navigation_bar.messages": "Messages",
"navigation_bar.mutes": "Muted users",
"navigation_bar.personal": "Personal",
"navigation_bar.pins": "Pinned posts",
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
"notification.emoji_react": "{name} reacted to your post",
"notification.favourite": "{name} liked your post",
"notification.follow": "{name} followed you",
"notification.mention": "{name} mentioned you",
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} reposted your post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Likes:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
"notifications.column_settings.filter_bar.show": "Show",
"notifications.column_settings.follow": "New followers:",
"notifications.column_settings.mention": "Mentions:",
"notifications.column_settings.poll": "Poll results:",
"notifications.column_settings.push": "Push notifications",
"notifications.column_settings.reblog": "Reposts:",
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
"notifications.filter.all": "All",
"notifications.filter.boosts": "Reposts",
"notifications.filter.favourites": "Likes",
"notifications.filter.follows": "Follows",
"notifications.filter.mentions": "Mentions",
"notifications.filter.polls": "Poll results",
"notifications.group": "{count} notifications",
"notifications.queue_label": "Click to see {count} new {count, plural, one {notification} other {notifications}}",
"pinned_statuses.none": "No pins to show.",
"poll.closed": "Closed",
"poll.refresh": "Refresh",
"poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
"poll.vote": "Vote",
"poll_button.add_poll": "Add a poll",
"poll_button.remove_poll": "Remove poll",
"preferences.fields.auto_play_gif_label": "Auto-play animated GIFs",
"preferences.fields.boost_modal_label": "Show confirmation dialog before reposting",
"preferences.fields.delete_modal_label": "Show confirmation dialog before deleting a post",
"preferences.fields.demetricator_label": "Use Demetricator",
"preferences.fields.dyslexic_font_label": "Dyslexic mode",
"preferences.fields.expand_spoilers_label": "Always expand posts marked with content warnings",
"preferences.fields.language_label": "Language",
"preferences.fields.privacy_label": "Post privacy",
"preferences.fields.reduce_motion_label": "Reduce motion in animations",
"preferences.fields.system_font_label": "Use system\"s default font",
"preferences.fields.theme_label": "Theme",
"preferences.fields.unfollow_modal_label": "Show confirmation dialog before unfollowing someone",
"preferences.hints.demetricator": "Decrease social media anxiety by hiding all numbers from the site.",
"preferences.hints.privacy_followers_only": "Only show to followers",
"preferences.hints.privacy_public": "Everyone can see",
"preferences.hints.privacy_unlisted": "Everyone can see, but not listed on public timelines",
"preferences.options.privacy_followers_only": "Followers-only",
"preferences.options.privacy_public": "Public",
"preferences.options.privacy_unlisted": "Unlisted",
"preferences.options.theme_dark": "Dark",
"preferences.options.theme_light": "Light",
"privacy.change": "Adjust post privacy",
"privacy.direct.long": "Post to mentioned users only",
"privacy.direct.short": "Direct",
"privacy.private.long": "Post to followers only",
"privacy.private.short": "Followers-only",
"privacy.public.long": "Post to public timelines",
"privacy.public.short": "Public",
"privacy.unlisted.long": "Do not post to public timelines",
"privacy.unlisted.short": "Unlisted",
"regeneration_indicator.label": "Loading…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"registration.agreement": "I agree to the {tos}.",
"registration.fields.confirm_placeholder": "Password (again)",
"registration.fields.email_placeholder": "E-Mail address",
"registration.fields.password_placeholder": "Password",
"registration.fields.username_placeholder": "Username",
"registration.lead": "With an account on {instance} you\"ll be able to follow people on any server in the fediverse.",
"registration.sign_up": "Sign up",
"registration.tos": "Terms of Service",
"relative_time.days": "{number}d",
"relative_time.hours": "{number}h",
"relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"reply_indicator.cancel": "Cancel",
"report.block": "Block {target}",
"report.block_hint": "Do you also want to block this account?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
"report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
"report.placeholder": "Additional comments",
"report.submit": "Submit",
"report.target": "Reporting {target}",
"search.placeholder": "Search",
"search_popout.search_format": "Advanced search format",
"search_popout.tips.full_text": "Simple text returns posts you have written, favorited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
"search_popout.tips.hashtag": "hashtag",
"search_popout.tips.status": "post",
"search_popout.tips.user": "user",
"search_results.accounts": "People",
"search_results.hashtags": "Hashtags",
"search_results.statuses": "Posts",
"search_results.top": "Top",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
"security.fields.email.label": "Email address",
"security.fields.new_password.label": "New password",
"security.fields.old_password.label": "Current password",
"security.fields.password.label": "Password",
"security.fields.password_confirmation.label": "New password (again)",
"security.headers.tokens": "Sessions",
"security.headers.update_email": "Change Email",
"security.headers.update_password": "Change Password",
"security.submit": "Save changes",
"security.tokens.revoke": "Revoke",
"security.update_email.fail": "Update email failed.",
"security.update_email.success": "Email successfully updated.",
"security.update_password.fail": "Update password failed.",
"security.update_password.success": "Password successfully updated.",
"signup_panel.subtitle": "Sign up now to discuss.",
"signup_panel.title": "New to {site_title}?",
"status.admin_account": "Open moderation interface for @{name}",
"status.admin_status": "Open this post in the moderation interface",
"status.block": "Block @{name}",
"status.cancel_reblog_private": "Un-repost",
"status.cannot_reblog": "This post cannot be reposted",
"status.copy": "Copy link to post",
"status.delete": "Delete",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
"status.embed": "Embed",
"status.favourite": "Like",
"status.filtered": "Filtered",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
"status.more": "More",
"status.mute": "Mute @{name}",
"status.mute_conversation": "Mute conversation",
"status.open": "Expand this post",
"status.pin": "Pin on profile",
"status.pinned": "Pinned post",
"status.read_more": "Read more",
"status.reblog": "Repost",
"status.reblog_private": "Repost to original audience",
"status.reblogged_by": "{name} reposted",
"status.reblogs.empty": "No one has reposted this post yet. When someone does, they will show up here.",
"status.redraft": "Delete & re-draft",
"status.remove_account_from_group": "Remove account from group",
"status.remove_post_from_group": "Remove post from group",
"status.reply": "Reply",
"status.replyAll": "Reply to thread",
"status.report": "Report @{name}",
"status.sensitive_warning": "Sensitive content",
"status.share": "Share",
"status.show_less": "Show less",
"status.show_less_all": "Show less for all",
"status.show_more": "Show more",
"status.show_more_all": "Show more for all",
"status.show_thread": "Show thread",
"status.unmute_conversation": "Unmute conversation",
"status.unpin": "Unpin from profile",
"status_list.queue_label": "Click to see {count} new {count, plural, one {post} other {posts}}",
"suggestions.dismiss": "Dismiss suggestion",
"tabs_bar.apps": "Apps",
"tabs_bar.home": "Home",
"tabs_bar.news": "News",
"tabs_bar.notifications": "Notifications",
"tabs_bar.post": "Post",
"tabs_bar.search": "Search",
"time_remaining.days": "{number, plural, one {# day} other {# days}} left",
"time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
"time_remaining.moments": "Moments remaining",
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
"trends.title": "Trends",
"ui.beforeunload": "Your draft will be lost if you leave.",
"unauthorized_modal.footer": "Already have an account? {login}.",
"unauthorized_modal.text": "You need to be logged in to do that.",
"unauthorized_modal.title": "Sign up for {site_title}",
"upload_area.title": "Drag & drop to upload",
"upload_button.label": "Add media attachment",
"upload_error.limit": "File upload limit exceeded.",
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.description": "Describe for the visually impaired",
"upload_form.focus": "Change preview",
"upload_form.undo": "Delete",
"upload_progress.label": "Uploading...",
"video.close": "Close video",
"video.exit_fullscreen": "Exit full screen",
"video.expand": "Expand video",
"video.fullscreen": "Full screen",
"video.hide": "Hide video",
"video.mute": "Mute sound",
"video.pause": "Pause",
"video.play": "Play",
"video.unmute": "Unmute sound",
"who_to_follow.title": "Who To Follow"
}

@ -0,0 +1,18 @@
{
"notifications": {
"last_read_id": "35098814",
"version": 361,
"updated_at": "2019-11-26T22:37:25.239Z",
"pleroma": {
"unread_count": 3
}
},
"home": {
"last_read_id": "103206604258487607",
"version": 468,
"updated_at": "2019-11-26T22:37:25.235Z",
"pleroma": {
"unread_count": 32
}
}
}

@ -0,0 +1,250 @@
{
"account": {
"acct": "crockwave",
"avatar": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png",
"avatar_static": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png",
"bot": false,
"created_at": "2020-02-26T16:31:25.000Z",
"display_name": "Curtis Rock",
"emojis": [],
"fields": [
{
"name": "Web Site/Book",
"value": "<a href=\"https://teci.world/a-users-guide-to-the-great-awakening\" rel=\"ugc\">https://teci.world/a-users-guide-to-the-great-awakening</a>"
},
{
"name": "Gab",
"value": "<a href=\"https://gab.com/crockwave\" rel=\"ugc\">https://gab.com/crockwave</a>"
},
{
"name": "Twitter",
"value": "<a href=\"https://twitter.com/GAP_Great\" rel=\"ugc\">https://twitter.com/GAP_Great</a>"
},
{
"name": "MeWe",
"value": "<a href=\"https://mewe.com/i/curtisrock\" rel=\"ugc\">https://mewe.com/i/curtisrock</a>"
}
],
"followers_count": 13,
"following_count": 11,
"header": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png",
"header_static": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png",
"id": "9v5c6xSEgAi3Zu1Lv6",
"locked": false,
"note": "soapbox development team test test2",
"pleroma": {
"background_image": null,
"confirmation_pending": false,
"deactivated": false,
"hide_favorites": true,
"hide_followers": false,
"hide_followers_count": false,
"hide_follows": false,
"hide_follows_count": false,
"is_admin": false,
"is_moderator": false,
"relationship": {
"blocked_by": false,
"blocking": false,
"domain_blocking": false,
"endorsed": false,
"followed_by": true,
"following": true,
"id": "9v5c6xSEgAi3Zu1Lv6",
"muting": false,
"muting_notifications": false,
"requested": false,
"showing_reblogs": true,
"subscribing": false
},
"skip_thread_containment": false,
"tags": []
},
"source": {
"fields": [
{
"name": "Web Site/Book",
"value": "https://teci.world/a-users-guide-to-the-great-awakening"
},
{
"name": "Gab",
"value": "https://gab.com/crockwave"
},
{
"name": "Twitter",
"value": "https://twitter.com/GAP_Great"
},
{
"name": "MeWe",
"value": "https://mewe.com/i/curtisrock"
}
],
"note": "soapbox development team test test2",
"pleroma": {
"actor_type": "Person",
"discoverable": false
},
"sensitive": false
},
"statuses_count": 212,
"url": "https://gleasonator.com/users/crockwave",
"username": "crockwave"
},
"created_at": "2020-06-10T02:51:05.000Z",
"id": "10743",
"pleroma": {
"is_seen": true
},
"status": {
"account": {
"acct": "alex",
"avatar": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg",
"avatar_static": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg",
"bot": false,
"created_at": "2020-01-08T01:25:43.000Z",
"display_name": "Alex Gleason",
"emojis": [],
"fields": [
{
"name": "Website",
"value": "<a href=\"https://alexgleason.me\" rel=\"ugc\">https://alexgleason.me</a>"
},
{
"name": "Pleroma+Soapbox",
"value": "<a href=\"https://soapbox.pub\" rel=\"ugc\">https://soapbox.pub</a>"
},
{
"name": "Email",
"value": "alex@alexgleason.me"
},
{
"name": "Gender identity",
"value": "Soyboy"
}
],
"follow_requests_count": 0,
"followers_count": 474,
"following_count": 1083,
"header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png",
"header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png",
"id": "9v5bmRalQvjOy0ECcC",
"locked": false,
"note": "Fediverse developer. I come in peace. <a class=\"hashtag\" data-tag=\"vegan\" href=\"https://gleasonator.com/tag/vegan\">#vegan</a> <a class=\"hashtag\" data-tag=\"freeculture\" href=\"https://gleasonator.com/tag/freeculture\">#freeculture</a> <a class=\"hashtag\" data-tag=\"atheist\" href=\"https://gleasonator.com/tag/atheist\">#atheist</a> <a class=\"hashtag\" data-tag=\"antiporn\" href=\"https://gleasonator.com/tag/antiporn\">#antiporn</a> <a class=\"hashtag\" data-tag=\"gendercritical\" href=\"https://gleasonator.com/tag/gendercritical\">#gendercritical</a>. Boosts ≠ endorsements.",
"pleroma": {
"allow_following_move": true,
"background_image": null,
"confirmation_pending": false,
"deactivated": false,
"hide_favorites": true,
"hide_followers": false,
"hide_followers_count": false,
"hide_follows": false,
"hide_follows_count": false,
"is_admin": true,
"is_moderator": false,
"notification_settings": {
"followers": true,
"follows": true,
"non_followers": true,
"non_follows": true,
"privacy_option": false
},
"relationship": {
"blocked_by": false,
"blocking": false,
"domain_blocking": false,
"endorsed": false,
"followed_by": false,
"following": false,
"id": "9v5bmRalQvjOy0ECcC",
"muting": false,
"muting_notifications": false,
"requested": false,
"showing_reblogs": true,
"subscribing": false
},
"skip_thread_containment": false,
"tags": [],
"unread_conversation_count": 25
},
"source": {
"fields": [
{
"name": "Website",
"value": "https://alexgleason.me"
},
{
"name": "Pleroma+Soapbox",
"value": "https://soapbox.pub"
},
{
"name": "Email",
"value": "alex@alexgleason.me"
},
{
"name": "Gender identity",
"value": "Soyboy"
}
],
"note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.",
"pleroma": {
"actor_type": "Person",
"discoverable": false,
"no_rich_text": false,
"show_role": true
},
"privacy": "public",
"sensitive": false
},
"statuses_count": 4857,
"url": "https://gleasonator.com/users/alex",
"username": "alex"
},
"application": {
"name": "Web",
"website": null
},
"bookmarked": false,
"card": null,
"content": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.<br/><br/>Pleroma FE doesn&#39;t seem to report coverage, but I suspect it&#39;s better than both of these combined.<br/><br/>I don&#39;t know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus.",
"created_at": "2020-06-10T01:29:20.000Z",
"emojis": [],
"favourited": false,
"favourites_count": 4,
"id": "9vvNxoo5EFbbnfdXQu",
"in_reply_to_account_id": null,
"in_reply_to_id": null,
"language": null,
"media_attachments": [],
"mentions": [],
"muted": false,
"pinned": false,
"pleroma": {
"content": {
"text_plain": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus."
},
"conversation_id": 1168229,
"direct_conversation_id": null,
"emoji_reactions": [],
"expires_at": null,
"in_reply_to_account_acct": null,
"local": true,
"spoiler_text": {
"text_plain": ""
},
"thread_muted": false
},
"poll": null,
"reblog": null,
"reblogged": false,
"reblogs_count": 0,
"replies_count": 0,
"sensitive": false,
"spoiler_text": "",
"tags": [],
"uri": "https://gleasonator.com/objects/aa294f83-5a6c-4d2b-ba20-2b8bf69a82ba",
"url": "https://gleasonator.com/notice/9vvNxoo5EFbbnfdXQu",
"visibility": "public"
},
"type": "favourite"
}

@ -189,7 +189,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus."
"text_plain": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus."
},
"conversation_id": 1168229,
"direct_conversation_id": null,
@ -198,7 +198,7 @@
"in_reply_to_account_acct": null,
"local": true,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -439,7 +439,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus."
"text_plain": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus."
},
"conversation_id": 1168229,
"direct_conversation_id": null,
@ -448,7 +448,7 @@
"in_reply_to_account_acct": null,
"local": true,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -668,7 +668,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus."
"text_plain": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus."
},
"conversation_id": 1168229,
"direct_conversation_id": null,
@ -677,7 +677,7 @@
"in_reply_to_account_acct": null,
"local": true,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -918,7 +918,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "@alex you dont need to write tests when your community builds a social framework that flags people not using your software as bad people. They have no choice but to eat it up bugs in all"
"text_plain": "@alex you dont need to write tests when your community builds a social framework that flags people not using your software as bad people. They have no choice but to eat it up bugs in all"
},
"conversation_id": 1168229,
"direct_conversation_id": null,
@ -933,7 +933,7 @@
"in_reply_to_account_acct": "alex",
"local": false,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -1140,7 +1140,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus."
"text_plain": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus."
},
"conversation_id": 1168229,
"direct_conversation_id": null,
@ -1149,7 +1149,7 @@
"in_reply_to_account_acct": null,
"local": true,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -1316,7 +1316,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "@alex The first step to getting people to commit inhumane acts is to convince them that they are incapable of doing so."
"text_plain": "@alex The first step to getting people to commit inhumane acts is to convince them that they are incapable of doing so."
},
"conversation_id": 1117237,
"direct_conversation_id": null,
@ -1325,7 +1325,7 @@
"in_reply_to_account_acct": "alex",
"local": false,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -1532,7 +1532,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "Pleroma Recurring Donations update: looking into other solutions, possibly working from fosspay instead: https://git.pleroma.social/pleroma/pleroma/-/issues/1853#note_62881"
"text_plain": "Pleroma Recurring Donations update: looking into other solutions, possibly working from fosspay instead: https://git.pleroma.social/pleroma/pleroma/-/issues/1853#note_62881"
},
"conversation_id": 1149840,
"direct_conversation_id": null,
@ -1541,7 +1541,7 @@
"in_reply_to_account_acct": null,
"local": true,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -1714,7 +1714,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "@alex @crockwave well, the preliminary state of the issue is not \"no it's not happening\", but rather \" let's find a way to make this possible in the generic case\", so we'll see what can be done. I think a wrapper is definitely possible but also probably expensive to maintain."
"text_plain": "@alex @crockwave well, the preliminary state of the issue is not \"no it's not happening\", but rather \" let's find a way to make this possible in the generic case\", so we'll see what can be done. I think a wrapper is definitely possible but also probably expensive to maintain."
},
"conversation_id": 1149840,
"direct_conversation_id": null,
@ -1723,7 +1723,7 @@
"in_reply_to_account_acct": "alex",
"local": false,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -1971,7 +1971,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "@crockwave I think we can achieve both those things (funding goal on homepage, Patron badge) by exposing API endpoints from fosspay.I agree a wrapper service could provide many future benefits, but I've done that exact thing before (see: Mastodon Engine: https://gitlab.com/soapbox-pub/mastodon-engine ) and it was experimental, back-breaking, and required a DEEP understanding of the underlying tech. I just don't have the time or energy to dive that deep into Phoenix right now, especially not having a strong grasp of Elixir."
"text_plain": "@crockwave I think we can achieve both those things (funding goal on homepage, Patron badge) by exposing API endpoints from fosspay.I agree a wrapper service could provide many future benefits, but I've done that exact thing before (see: Mastodon Engine: https://gitlab.com/soapbox-pub/mastodon-engine ) and it was experimental, back-breaking, and required a DEEP understanding of the underlying tech. I just don't have the time or energy to dive that deep into Phoenix right now, especially not having a strong grasp of Elixir."
},
"conversation_id": 1149840,
"direct_conversation_id": null,
@ -1980,7 +1980,7 @@
"in_reply_to_account_acct": "crockwave",
"local": true,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -2188,7 +2188,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "Been feeling like I'm losing my mind a bit the past few days. I feel like I'm pushing heavy weights up a steep hill and it's never-ending. Can't wait to get to the top so I can sail down.Working on automated tests today."
"text_plain": "Been feeling like I'm losing my mind a bit the past few days. I feel like I'm pushing heavy weights up a steep hill and it's never-ending. Can't wait to get to the top so I can sail down.Working on automated tests today."
},
"conversation_id": 1150963,
"direct_conversation_id": null,
@ -2203,7 +2203,7 @@
"in_reply_to_account_acct": null,
"local": true,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -2438,7 +2438,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "@alex Can you create some automated test templates, then outsource the drudgerous portion of the effort to your support team?"
"text_plain": "@alex Can you create some automated test templates, then outsource the drudgerous portion of the effort to your support team?"
},
"conversation_id": 1150963,
"direct_conversation_id": null,
@ -2447,7 +2447,7 @@
"in_reply_to_account_acct": "alex",
"local": true,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -2640,7 +2640,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "@alex it's good to be thorough, and is useful if that code ever changes down the line."
"text_plain": "@alex it's good to be thorough, and is useful if that code ever changes down the line."
},
"conversation_id": 1147390,
"direct_conversation_id": null,
@ -2649,7 +2649,7 @@
"in_reply_to_account_acct": "alex",
"local": false,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -2834,7 +2834,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "@alex whatever you do: KEEP GOING ALMOST THERE YOU CAN DO IT!"
"text_plain": "@alex whatever you do: KEEP GOING ALMOST THERE YOU CAN DO IT!"
},
"conversation_id": 1150963,
"direct_conversation_id": null,
@ -2843,7 +2843,7 @@
"in_reply_to_account_acct": "alex",
"local": false,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -3063,7 +3063,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "Been feeling like I'm losing my mind a bit the past few days. I feel like I'm pushing heavy weights up a steep hill and it's never-ending. Can't wait to get to the top so I can sail down.Working on automated tests today."
"text_plain": "Been feeling like I'm losing my mind a bit the past few days. I feel like I'm pushing heavy weights up a steep hill and it's never-ending. Can't wait to get to the top so I can sail down.Working on automated tests today."
},
"conversation_id": 1150963,
"direct_conversation_id": null,
@ -3078,7 +3078,7 @@
"in_reply_to_account_acct": null,
"local": true,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -3271,7 +3271,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "@alex You're close to a finish line 🌈"
"text_plain": "@alex You're close to a finish line 🌈"
},
"conversation_id": 1150963,
"direct_conversation_id": null,
@ -3280,7 +3280,7 @@
"in_reply_to_account_acct": "alex",
"local": false,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -3515,7 +3515,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "@alex I think a wrapper service can provide many future benefits, if the complications are manageable. It would allow you to stay well ahead of the features development curve. There is also great value in displaying funding goals status on the home page. The Patron tag is also highly valuable from a social community standpoint."
"text_plain": "@alex I think a wrapper service can provide many future benefits, if the complications are manageable. It would allow you to stay well ahead of the features development curve. There is also great value in displaying funding goals status on the home page. The Patron tag is also highly valuable from a social community standpoint."
},
"conversation_id": 1149840,
"direct_conversation_id": null,
@ -3524,7 +3524,7 @@
"in_reply_to_account_acct": "alex",
"local": true,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -3765,7 +3765,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "Pleroma Recurring Donations update: looking into other solutions, possibly working from fosspay instead: https://git.pleroma.social/pleroma/pleroma/-/issues/1853#note_62881"
"text_plain": "Pleroma Recurring Donations update: looking into other solutions, possibly working from fosspay instead: https://git.pleroma.social/pleroma/pleroma/-/issues/1853#note_62881"
},
"conversation_id": 1149840,
"direct_conversation_id": null,
@ -3774,7 +3774,7 @@
"in_reply_to_account_acct": null,
"local": true,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -3995,7 +3995,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "@lain Yeah I have no clue what the reasoning was for that one. 😆 It's crazy how \"words\" are such an ongoing issue in FOSS.A seasoned programmer once told me she's had the deepest programming debates about \"naming things.\" It's true that names are important in programming, but at the end of the day it's just code."
"text_plain": "@lain Yeah I have no clue what the reasoning was for that one. 😆 It's crazy how \"words\" are such an ongoing issue in FOSS.A seasoned programmer once told me she's had the deepest programming debates about \"naming things.\" It's true that names are important in programming, but at the end of the day it's just code."
},
"conversation_id": 1122858,
"direct_conversation_id": null,
@ -4004,7 +4004,7 @@
"in_reply_to_account_acct": "lain@lain.com",
"local": true,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -4191,7 +4191,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "@alex @lain The Peter Principle has a chapter on this.The less significant the decision the more people feel qualified to have an opinion on it."
"text_plain": "@alex @lain The Peter Principle has a chapter on this.The less significant the decision the more people feel qualified to have an opinion on it."
},
"conversation_id": 1122858,
"direct_conversation_id": null,
@ -4200,7 +4200,7 @@
"in_reply_to_account_acct": "alex",
"local": false,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},
@ -4431,7 +4431,7 @@
"pinned": false,
"pleroma": {
"content": {
"text/plain": "Pleroma Recurring Donations update: looking into other solutions, possibly working from fosspay instead: https://git.pleroma.social/pleroma/pleroma/-/issues/1853#note_62881"
"text_plain": "Pleroma Recurring Donations update: looking into other solutions, possibly working from fosspay instead: https://git.pleroma.social/pleroma/pleroma/-/issues/1853#note_62881"
},
"conversation_id": 1149840,
"direct_conversation_id": null,
@ -4440,7 +4440,7 @@
"in_reply_to_account_acct": null,
"local": true,
"spoiler_text": {
"text/plain": ""
"text_plain": ""
},
"thread_muted": false
},

@ -0,0 +1,14 @@
{
"showing_reblogs": true,
"followed_by": false,
"subscribing": false,
"blocked_by": false,
"requested": false,
"domain_blocking": false,
"following": false,
"endorsed": false,
"blocking": true,
"muting": false,
"id": "9vMAje101ngtjlMj7w",
"muting_notifications": true
}

@ -0,0 +1,8 @@
{
"access_token": "UVBP2e17b4pTpb_h8fImIm3F5a66IBVb-JkyZHs4gLE",
"expires_in": 600,
"me": "https://social.teci.world/users/curtis",
"refresh_token": "c2DpbVxYZBJDogNn-VBNFES72yXPNUYQCv0CrXGOplY",
"scope": "read write follow push admin",
"token_type": "Bearer"
}

@ -1,8 +1,48 @@
import reducer from '../accounts';
import { Map as ImmutableMap } from 'immutable';
// import * as actions from 'soapbox/actions/importer';
// import { take } from 'lodash';
// import accounts from 'soapbox/__fixtures__/accounts.json';
describe('accounts reducer', () => {
it('should return the initial state', () => {
expect(reducer(undefined, {})).toEqual(ImmutableMap());
});
// fails to add normalized accounts to state
// it('should handle ACCOUNT_IMPORT', () => {
// const state = ImmutableMap({ });
// const account = take(accounts, 1);
// const action = {
// type: actions.ACCOUNT_IMPORT,
// account: account,
// };
// debugger;
// expect(reducer(state, action).toJS()).toMatchObject({
// });
// });
// fails to add normalized accounts to state
// it('should handle ACCOUNTS_IMPORT', () => {
// const state = ImmutableMap({ });
// const accounts = take(accounts, 2);
// const action = {
// type: actions.ACCOUNTS_IMPORT,
// accounts: accounts,
// };
// expect(reducer(state, action).toJS()).toMatchObject({
// });
// });
//
// it('should handle ACCOUNT_FETCH_FAIL_FOR_USERNAME_LOOKUP', () => {
// const state = ImmutableMap({ username: 'curtis' });
// const action = {
// type: actions.ACCOUNT_FETCH_FAIL_FOR_USERNAME_LOOKUP,
// username: 'curtis',
// };
// expect(reducer(state, action).toJS()).toMatchObject({
// username: 'curtis',
// });
// });
});

@ -1,8 +1,37 @@
import reducer from '../accounts_counters';
import { Map as ImmutableMap } from 'immutable';
// import { ACCOUNT_FOLLOW_SUCCESS, ACCOUNT_UNFOLLOW_SUCCESS } from 'soapbox/actions/accounts';
// import relationship from 'soapbox/__fixtures__/relationship.json';
// import accounts_counter_initial from 'soapbox/__fixtures__/accounts_counter_initial.json';
// import accounts_counter_unfollow from 'soapbox/__fixtures__/accounts_counter_unfollow.json';
// import accounts_counter_follow from 'soapbox/__fixtures__/accounts_counter_follow.json';
describe('accounts_counters reducer', () => {
it('should return the initial state', () => {
expect(reducer(undefined, {})).toEqual(ImmutableMap());
});
// it('should handle ACCOUNT_FOLLOW_SUCCESS', () => {
// const state = ImmutableList([accounts_counter_initial]);
// const action = {
// type: ACCOUNT_FOLLOW_SUCCESS,
// relationship: relationship,
// alreadyFollowing: false,
// };
// expect(reducer(state, action)).toEqual(
// ImmutableList([ accounts_counter_follow ]));
// });
//
// it('should handle ACCOUNT_UNFOLLOW_SUCCESS', () => {
// const state = ImmutableList([accounts_counter_initial]);
// const action = {
// type: ACCOUNT_UNFOLLOW_SUCCESS,
// relationship: relationship,
// alreadyFollowing: true,
// };
// expect(reducer(state, action)).toEqual(
// ImmutableList([accounts_counter_unfollow]));
// });
});

@ -1,8 +1,72 @@
import reducer from '../alerts';
import { List as ImmutableList } from 'immutable';
import * as actions from 'soapbox/actions/alerts';
describe('alerts reducer', () => {
it('should return the initial state', () => {
expect(reducer(undefined, {})).toEqual(ImmutableList());
});
it('should handle ALERT_SHOW', () => {
const state = ImmutableList([]);
const action = {
type: actions.ALERT_SHOW,
title: 'alert_title',
message: 'this is an alert message',
};
expect(reducer(state, action).toJS()).toMatchObject([
{
key: 0,
message: 'this is an alert message',
title: 'alert_title',
},
]);
});
// it('should handle ALERT_DISMISS', () => {
// const state = ImmutableList([
// {
// key: 0,
// message: 'message_1',
// title: 'title_1',
// },
// {
// key: 1,
// message: 'message_2',
// title: 'title_2',
// },
// ]);
// const action = {
// type: actions.ALERT_DISMISS,
// alert: { key: 0 },
// };
// expect(reducer(state, action).toJS()).toMatchObject([
// {
// key: 1,
// message: 'message_2',
// title: 'title_2',
// }
// ]);
// });
it('should handle ALERT_CLEAR', () => {
const state = ImmutableList([
{
key: 0,
message: 'message_1',
title: 'title_1',
},
{
key: 1,
message: 'message_2',
title: 'title_2',
},
]);
const action = {
type: actions.ALERT_CLEAR,
};
expect(reducer(state, action).toJS()).toMatchObject({
});
});
});

@ -1,5 +1,8 @@
import reducer from '../auth';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import * as actions from 'soapbox/actions/auth';
// import app from 'soapbox/__fixtures__/app.json';
import user from 'soapbox/__fixtures__/user.json';
describe('auth reducer', () => {
it('should return the initial state', () => {
@ -9,4 +12,113 @@ describe('auth reducer', () => {
tokens: ImmutableList(),
}));
});
it('should handle AUTH_APP_CREATED', () => {
const state = ImmutableMap({ });
const auth = {
auth: {
app: {
vapid_key: 'BHczIFh4Wn3Q_7wDgehaB8Ti3Uu8BoyOgXxkOVuEJRuEqxtd9TAno8K9ycz4myiQ1ruiyVfG6xT1JLeXtpxDzUs',
token_type: 'Bearer',
client_secret: 'HU6RGO4284Edr4zucuWmn8OFjcpVtMsoXJU0-8tpwRM',
redirect_uri: 'urn:ietf:wg:oauth:2.0:oob',
created_at: 1594050270,
name: 'SoapboxFE_2020-07-06T15:43:31.989Z',
client_id: 'Q0A2r_9ZcEORMenj9kuDRQc3UVL8ypQRoNJ6XQHWJU8',
expires_in: 600,
scope: 'read write follow push admin',
refresh_token: 'aydRA4eragIhavCdAyg6QQnDJmiMbdc-oEBvHYcW_PQ',
website: null,
id: '113',
access_token: 'pbXS8HkoWodrAt_QE1NENcwqigxgWr3P1RIQCKMN0Os',
},
user: {
access_token: 'UVBP2e17b4pTpb_h8fImIm3F5a66IBVb-JkyZHs4gLE',
expires_in: 600,
me: 'https://social.teci.world/users/curtis',
refresh_token: 'c2DpbVxYZBJDogNn-VBNFES72yXPNUYQCv0CrXGOplY',
scope: 'read write follow push admin',
token_type: 'Bearer',
},
tokens: [],
},
};
const action = {
type: actions.AUTH_APP_CREATED,
app: auth,
};
expect(reducer(state, action).toJS()).toMatchObject({
app: auth,
});
});
// Fails with TypeError: cannot read property merge of undefined
// it('should handle the Action AUTH_APP_AUTHORIZED', () => {
// const state = ImmutableMap({
// auth: {
// app: {
// vapid_key: 'oldVapidKey',
// token_type: 'Bearer',
// client_secret: 'oldClientSecret',
// redirect_uri: 'urn:ietf:wg:oauth:2.0:oob',
// created_at: 1594764335,
// name: 'SoapboxFE_2020-07-14T22:05:17.054Z',
// client_id: 'bjiy8AxGKXXesfZcyp_iN-uQVE6Cnl03efWoSdOPh9M',
// expires_in: 600,
// scope: 'read write follow push admin',
// refresh_token: 'oldRefreshToken',
// website: null,
// id: '134',
// access_token: 'oldAccessToken',
// },
// },
// });
// const action = {
// type: actions.AUTH_APP_AUTHORIZED,
// app: app,
// };
// expect(reducer(state, action).toJS()).toMatchObject({
// app: app,
// });
// });
it('should handle the Action AUTH_LOGGED_IN', () => {
const state = ImmutableMap({
user: {
access_token: 'UVBP2e17b4pTpb_h8fImIm3F5a66IBVb-JkyZHs4gLE',
expires_in: 600,
me: 'https://social.teci.world/users/curtis',
refresh_token: 'c2DpbVxYZBJDogNn-VBNFES72yXPNUYQCv0CrXGOplY',
scope: 'read write follow push admin',
token_type: 'Bearer',
},
});
const action = {
type: actions.AUTH_LOGGED_IN,
user: user,
};
expect(reducer(state, action).toJS()).toMatchObject({
user: user,
});
});
it('should handle the Action AUTH_LOGGED_OUT', () => {
const state = ImmutableMap({
user: {
access_token: 'UVBP2e17b4pTpb_h8fImIm3F5a66IBVb-JkyZHs4gLE',
expires_in: 600,
me: 'https://social.teci.world/users/curtis',
refresh_token: 'c2DpbVxYZBJDogNn-VBNFES72yXPNUYQCv0CrXGOplY',
scope: 'read write follow push admin',
token_type: 'Bearer',
},
});
const action = {
type: actions.AUTH_LOGGED_OUT,
};
expect(reducer(state, action).toJS()).toMatchObject({
user: {},
});
});
});

@ -1,8 +1,11 @@
import reducer from '../compose';
import { Map as ImmutableMap } from 'immutable';
import { COMPOSE_REPLY } from 'soapbox/actions/compose';
import { ME_FETCH_SUCCESS, ME_PATCH_SUCCESS } from 'soapbox/actions/me';
import { SETTING_CHANGE } from 'soapbox/actions/settings';
import * as actions from 'soapbox/actions/compose';
//import { STORE_HYDRATE } from 'soapbox/actions/store';
//import { REDRAFT } from 'soapbox/actions/statuses';
import { TIMELINE_DELETE } from 'soapbox/actions/timelines';
describe('compose reducer', () => {
it('returns the initial state by default', () => {
@ -34,7 +37,7 @@ describe('compose reducer', () => {
it('uses \'public\' scope as default', () => {
const action = {
type: COMPOSE_REPLY,
type: actions.COMPOSE_REPLY,
status: ImmutableMap(),
account: ImmutableMap(),
};
@ -44,7 +47,7 @@ describe('compose reducer', () => {
it('uses \'direct\' scope when replying to a DM', () => {
const state = ImmutableMap({ default_privacy: 'public' });
const action = {
type: COMPOSE_REPLY,
type: actions.COMPOSE_REPLY,
status: ImmutableMap({ visibility: 'direct' }),
account: ImmutableMap(),
};
@ -54,7 +57,7 @@ describe('compose reducer', () => {
it('uses \'private\' scope when replying to a private post', () => {
const state = ImmutableMap({ default_privacy: 'public' });
const action = {
type: COMPOSE_REPLY,
type: actions.COMPOSE_REPLY,
status: ImmutableMap({ visibility: 'private' }),
account: ImmutableMap(),
};
@ -64,7 +67,7 @@ describe('compose reducer', () => {
it('uses \'unlisted\' scope when replying to an unlisted post', () => {
const state = ImmutableMap({ default_privacy: 'public' });
const action = {
type: COMPOSE_REPLY,
type: actions.COMPOSE_REPLY,
status: ImmutableMap({ visibility: 'unlisted' }),
account: ImmutableMap(),
};
@ -74,7 +77,7 @@ describe('compose reducer', () => {
it('uses \'private\' scope when set as preference and replying to a public post', () => {
const state = ImmutableMap({ default_privacy: 'private' });
const action = {
type: COMPOSE_REPLY,
type: actions.COMPOSE_REPLY,
status: ImmutableMap({ visibility: 'public' }),
account: ImmutableMap(),
};
@ -84,7 +87,7 @@ describe('compose reducer', () => {
it('uses \'unlisted\' scope when set as preference and replying to a public post', () => {
const state = ImmutableMap({ default_privacy: 'unlisted' });
const action = {
type: COMPOSE_REPLY,
type: actions.COMPOSE_REPLY,
status: ImmutableMap({ visibility: 'public' }),
account: ImmutableMap(),
};
@ -127,4 +130,663 @@ describe('compose reducer', () => {
privacy: 'public',
});
});
// it('should handle STORE_HYDRATE', () => {
// const state = ImmutableMap({ });
// const action = {
// type: STORE_HYDRATE,
// state: ImmutableMap({
// compose: true,
// text: 'newtext',
// }),
// };
// expect(reducer(state, action)).toEqual(ImmutableMap({
// state: ImmutableMap({
// compose: true,
// text: 'newtext',
// }),
// }));
// });
it('should handle COMPOSE_MOUNT', () => {
const state = ImmutableMap({ mounted: 1 });
const action = {
type: actions.COMPOSE_MOUNT,
};
expect(reducer(state, action).toJS()).toMatchObject({
mounted: 2,
});
});
it('should handle COMPOSE_UNMOUNT', () => {
const state = ImmutableMap({ mounted: 1 });
const action = {
type: actions.COMPOSE_UNMOUNT,
};
expect(reducer(state, action).toJS()).toMatchObject({
mounted: 0,
});
});
//Remove this test once spoiler is decoupled from marking media as sensitive
it('should handle COMPOSE_SENSITIVITY_CHANGE on Mark Sensitive click, don\'t toggle if spoiler active', () => {
const state = ImmutableMap({ spoiler: true, sensitive: true, idempotencyKey: null });
const action = {
type: actions.COMPOSE_SENSITIVITY_CHANGE,
};
expect(reducer(state, action).toJS()).toMatchObject({
sensitive: true,
});
});
//Edit this test to not pass spoiler state once spoiler is decoupled from marking media as sensitive
it('should handle COMPOSE_SENSITIVITY_CHANGE on Mark Sensitive click, toggle if spoiler inactive', () => {
const state = ImmutableMap({ spoiler: false, sensitive: true });
const action = {
type: actions.COMPOSE_SENSITIVITY_CHANGE,
};
expect(reducer(state, action).toJS()).toMatchObject({
sensitive: false,
});
});
it('should handle COMPOSE_SPOILERNESS_CHANGE on CW button click', () => {
const state = ImmutableMap({ spoiler_text: 'spoiler text', spoiler: true, media_attachments: { } });
const action = {
type: actions.COMPOSE_SPOILERNESS_CHANGE,
};
expect(reducer(state, action).toJS()).toMatchObject({
spoiler: false,
spoiler_text: '',
});
});
it('should handle COMPOSE_SPOILER_TEXT_CHANGE', () => {
const state = ImmutableMap({ spoiler_text: 'prevtext' });
const action = {
type: actions.COMPOSE_SPOILER_TEXT_CHANGE,
text: 'nexttext',
};
expect(reducer(state, action).toJS()).toMatchObject({
spoiler_text: 'nexttext',
});
});
it('should handle COMPOSE_VISIBILITY_CHANGE', () => {
const state = ImmutableMap({ privacy: 'public' });
const action = {
type: actions.COMPOSE_VISIBILITY_CHANGE,
value: 'direct',
};
expect(reducer(state, action).toJS()).toMatchObject({
privacy: 'direct',
});
});
it('should handle COMPOSE_CHANGE', () => {
const state = ImmutableMap({ text: 'prevtext' });
const action = {
type: actions.COMPOSE_CHANGE,
text: 'nexttext',
};
expect(reducer(state, action).toJS()).toMatchObject({
text: 'nexttext',
});
});
it('should handle COMPOSE_COMPOSING_CHANGE', () => {
const state = ImmutableMap({ is_composing: true });
const action = {
type: actions.COMPOSE_COMPOSING_CHANGE,
value: false,
};
expect(reducer(state, action).toJS()).toMatchObject({
is_composing: false,
});
});
it('should handle COMPOSE_SUBMIT_REQUEST', () => {
const state = ImmutableMap({ is_submitting: false });
const action = {
type: actions.COMPOSE_SUBMIT_REQUEST,
};
expect(reducer(state, action).toJS()).toMatchObject({
is_submitting: true,
});
});
it('should handle COMPOSE_UPLOAD_CHANGE_REQUEST', () => {
const state = ImmutableMap({ is_changing_upload: false });
const action = {
type: actions.COMPOSE_UPLOAD_CHANGE_REQUEST,
};
expect(reducer(state, action).toJS()).toMatchObject({
is_changing_upload: true,
});
});
it('should handle COMPOSE_SUBMIT_SUCCESS', () => {
const state = ImmutableMap({ privacy: 'public' });
const action = {
type: actions.COMPOSE_SUBMIT_SUCCESS,
};
expect(reducer(state, action).toJS()).toMatchObject({
privacy: undefined,
});
});
it('should handle COMPOSE_SUBMIT_FAIL', () => {
const state = ImmutableMap({ is_submitting: true });
const action = {
type: actions.COMPOSE_SUBMIT_FAIL,
};
expect(reducer(state, action).toJS()).toMatchObject({
is_submitting: false,
});
});
it('should handle COMPOSE_UPLOAD_CHANGE_FAIL', () => {
const state = ImmutableMap({ is_changing_upload: true });
const action = {
type: actions.COMPOSE_UPLOAD_CHANGE_FAIL,
};
expect(reducer(state, action).toJS()).toMatchObject({
is_changing_upload: false,
});
});
it('should handle COMPOSE_UPLOAD_REQUEST', () => {
const state = ImmutableMap({ is_uploading: false });
const action = {
type: actions.COMPOSE_UPLOAD_REQUEST,
};
expect(reducer(state, action).toJS()).toMatchObject({
is_uploading: true,
});
});
it('should handle COMPOSE_UPLOAD_SUCCESS', () => {
const state = ImmutableMap({ media_attachments: [] });
const media = [
{
description: null,
id: '1375732379',
pleroma: {
mime_type: 'image/jpeg',
},
preview_url: 'https://media.gleasonator.com/media_attachments/files/000/853/856/original/7035d67937053e1d.jpg',
remote_url: 'https://media.gleasonator.com/media_attachments/files/000/853/856/original/7035d67937053e1d.jpg',
text_url: 'https://media.gleasonator.com/media_attachments/files/000/853/856/original/7035d67937053e1d.jpg',
type: 'image',
url: 'https://media.gleasonator.com/media_attachments/files/000/853/856/original/7035d67937053e1d.jpg',
},
];
const action = {
type: actions.COMPOSE_UPLOAD_SUCCESS,
media: media,
skipLoading: true,
};
expect(reducer(state, action).toJS()).toMatchObject({
is_uploading: false,
});
});
it('should handle COMPOSE_UPLOAD_FAIL', () => {
const state = ImmutableMap({ is_uploading: true });
const action = {
type: actions.COMPOSE_UPLOAD_FAIL,
};
expect(reducer(state, action).toJS()).toMatchObject({
is_uploading: false,
});
});
// it('should handle COMPOSE_UPLOAD_UNDO', () => {
// const state = ImmutableMap({
// media_attachments: ImmutableList([
// description: null,
// id: '1375732379',
// pleroma: {
// mime_type: 'image/jpeg'
// },
// preview_url: 'https://media.gleasonator.com/media_attachments/files/000/853/856/original/7035d67937053e1d.jpg',
// remote_url: 'https://media.gleasonator.com/media_attachments/files/000/853/856/original/7035d67937053e1d.jpg',
// text_url: 'https://media.gleasonator.com/media_attachments/files/000/853/856/original/7035d67937053e1d.jpg',
// type: 'image',
// url: 'https://media.gleasonator.com/media_attachments/files/000/853/856/original/7035d67937053e1d.jpg'
// ]),
// });
// const action = {
// type: actions.COMPOSE_UPLOAD_UNDO,
// mediaId: '1375732379',
// };
// expect(reducer(state, action)).toEqual({
// media_attachments: [],
// });
// });
it('should handle COMPOSE_UPLOAD_PROGRESS', () => {
const state = ImmutableMap({ progress: 0 });
const action = {
type: actions.COMPOSE_UPLOAD_PROGRESS,
loaded: 10,
total: 15,
};
expect(reducer(state, action).toJS()).toMatchObject({
progress: 67,
});
});
// it('should handle COMPOSE_MENTION', () => {
// const state = ImmutableMap({});
// const account = {
// '9w1HhmenIAKBHJiUs4': {
// header_static: 'https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png',
// display_name_html: 'Alex Gleason',
// bot: false,
// display_name: 'Alex Gleason',
// created_at: '2020-06-12T21:47:28.000Z',
// locked: false,
// emojis: [],
// header: 'https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png',
// url: 'https://gleasonator.com/users/alex',
// note: 'Fediverse developer. I come in peace. <a class="hashtag" data-tag="vegan" href="https://gleasonator.com/tag/vegan">#vegan</a> <a class="hashtag" data-tag="freeculture" href="https://gleasonator.com/tag/freeculture">#freeculture</a> <a class="hashtag" data-tag="atheist" href="https://gleasonator.com/tag/atheist">#atheist</a> <a class="hashtag" data-tag="antiporn" href="https://gleasonator.com/tag/antiporn">#antiporn</a> <a class="hashtag" data-tag="gendercritical" href="https://gleasonator.com/tag/gendercritical">#gendercritical</a>. Boosts ≠ endorsements.',
// acct: 'alex@gleasonator.com',
// avatar_static: 'https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg',
// username: 'alex',
// avatar: 'https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg',
// fields: [
// {
// name: 'Website',
// value: '<a href="https://alexgleason.me" rel="ugc">https://alexgleason.me</a>',
// name_emojified: 'Website',
// value_emojified: '<a href="https://alexgleason.me" rel="ugc">https://alexgleason.me</a>',
// value_plain: 'https://alexgleason.me'
// },
// {
// name: 'Pleroma+Soapbox',
// value: '<a href="https://soapbox.pub" rel="ugc">https://soapbox.pub</a>',
// name_emojified: 'Pleroma+Soapbox',
// value_emojified: '<a href="https://soapbox.pub" rel="ugc">https://soapbox.pub</a>',
// value_plain: 'https://soapbox.pub'
// },
// {
// name: 'Email',
// value: 'alex@alexgleason.me',
// name_emojified: 'Email',
// value_emojified: 'alex@alexgleason.me',
// value_plain: 'alex@alexgleason.me'
// },
// {
// name: 'Gender identity',
// value: 'Soyboy',
// name_emojified: 'Gender identity',
// value_emojified: 'Soyboy',
// value_plain: 'Soyboy'
// }
// ],
// pleroma: {
// hide_follows: false,
// hide_followers_count: false,
// background_image: null,
// confirmation_pending: false,
// is_moderator: false,
// hide_follows_count: false,
// hide_followers: false,
// relationship: {
// showing_reblogs: true,
// followed_by: false,
// subscribing: false,
// blocked_by: false,
// requested: false,
// domain_blocking: false,
// following: false,
// endorsed: false,
// blocking: false,
// muting: false,
// id: '9w1HhmenIAKBHJiUs4',
// muting_notifications: false
// },
// tags: [],
// hide_favorites: true,
// is_admin: false,
// skip_thread_containment: false
// },
// source: {
// fields: [],
// note: 'Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.',
// pleroma: {
// actor_type: 'Person',
// discoverable: false
// },
// sensitive: false
// },
// id: '9w1HhmenIAKBHJiUs4',
// note_emojified: 'Fediverse developer. I come in peace. <a class="hashtag" data-tag="vegan" href="https://gleasonator.com/tag/vegan">#vegan</a> <a class="hashtag" data-tag="freeculture" href="https://gleasonator.com/tag/freeculture">#freeculture</a> <a class="hashtag" data-tag="atheist" href="https://gleasonator.com/tag/atheist">#atheist</a> <a class="hashtag" data-tag="antiporn" href="https://gleasonator.com/tag/antiporn">#antiporn</a> <a class="hashtag" data-tag="gendercritical" href="https://gleasonator.com/tag/gendercritical">#gendercritical</a>. Boosts ≠ endorsements.'
// },
// };
// const action = {
// type: actions.COMPOSE_MENTION,
// account: account,
// };
// expect(reducer(state, action).toJS()).toMatchObject({
// text: '@alex@gleasonator.com',
// caretPosition: null,
// });
// });
// it('should handle COMPOSE_DIRECT', () => {
// const state = ImmutableMap({});
// const account = {
// '9w1HhmenIAKBHJiUs4': {
// header_static: 'https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png',
// display_name_html: 'Alex Gleason',
// bot: false,
// display_name: 'Alex Gleason',
// created_at: '2020-06-12T21:47:28.000Z',
// locked: false,
// emojis: [],
// header: 'https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png',
// url: 'https://gleasonator.com/users/alex',
// note: 'Fediverse developer. I come in peace. <a class="hashtag" data-tag="vegan" href="https://gleasonator.com/tag/vegan">#vegan</a> <a class="hashtag" data-tag="freeculture" href="https://gleasonator.com/tag/freeculture">#freeculture</a> <a class="hashtag" data-tag="atheist" href="https://gleasonator.com/tag/atheist">#atheist</a> <a class="hashtag" data-tag="antiporn" href="https://gleasonator.com/tag/antiporn">#antiporn</a> <a class="hashtag" data-tag="gendercritical" href="https://gleasonator.com/tag/gendercritical">#gendercritical</a>. Boosts ≠ endorsements.',
// acct: 'alex@gleasonator.com',
// avatar_static: 'https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg',
// username: 'alex',
// avatar: 'https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg',
// fields: [
// {
// name: 'Website',
// value: '<a href="https://alexgleason.me" rel="ugc">https://alexgleason.me</a>',
// name_emojified: 'Website',
// value_emojified: '<a href="https://alexgleason.me" rel="ugc">https://alexgleason.me</a>',
// value_plain: 'https://alexgleason.me'
// },
// {
// name: 'Pleroma+Soapbox',
// value: '<a href="https://soapbox.pub" rel="ugc">https://soapbox.pub</a>',
// name_emojified: 'Pleroma+Soapbox',
// value_emojified: '<a href="https://soapbox.pub" rel="ugc">https://soapbox.pub</a>',
// value_plain: 'https://soapbox.pub'
// },
// {
// name: 'Email',
// value: 'alex@alexgleason.me',
// name_emojified: 'Email',
// value_emojified: 'alex@alexgleason.me',
// value_plain: 'alex@alexgleason.me'
// },
// {
// name: 'Gender identity',
// value: 'Soyboy',
// name_emojified: 'Gender identity',
// value_emojified: 'Soyboy',
// value_plain: 'Soyboy'
// }
// ],
// pleroma: {
// hide_follows: false,
// hide_followers_count: false,
// background_image: null,
// confirmation_pending: false,
// is_moderator: false,
// hide_follows_count: false,
// hide_followers: false,
// relationship: {
// showing_reblogs: true,
// followed_by: false,
// subscribing: false,
// blocked_by: false,
// requested: false,
// domain_blocking: false,
// following: false,
// endorsed: false,
// blocking: false,
// muting: false,
// id: '9w1HhmenIAKBHJiUs4',
// muting_notifications: false
// },
// tags: [],
// hide_favorites: true,
// is_admin: false,
// skip_thread_containment: false
// },
// source: {
// fields: [],
// note: 'Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.',
// pleroma: {
// actor_type: 'Person',
// discoverable: false
// },
// sensitive: false
// },
// id: '9w1HhmenIAKBHJiUs4',
// note_emojified: 'Fediverse developer. I come in peace. <a class="hashtag" data-tag="vegan" href="https://gleasonator.com/tag/vegan">#vegan</a> <a class="hashtag" data-tag="freeculture" href="https://gleasonator.com/tag/freeculture">#freeculture</a> <a class="hashtag" data-tag="atheist" href="https://gleasonator.com/tag/atheist">#atheist</a> <a class="hashtag" data-tag="antiporn" href="https://gleasonator.com/tag/antiporn">#antiporn</a> <a class="hashtag" data-tag="gendercritical" href="https://gleasonator.com/tag/gendercritical">#gendercritical</a>. Boosts ≠ endorsements.'
// }
// };
// const action = {
// type: actions.COMPOSE_DIRECT,
// account: account,
// };
// expect(reducer(state, action).toJS()).toMatchObject({
// text: '@alex@gleasonator.com',
// caretPosition: null,
// privacy: 'direct',
// });
// });
//
it('should handle COMPOSE_SUGGESTIONS_CLEAR', () => {
const state = ImmutableMap({ });
const action = {
type: actions.COMPOSE_SUGGESTIONS_CLEAR,
suggestions: [],
suggestion_token: 'aiekdns3',
};
expect(reducer(state, action).toJS()).toMatchObject({
suggestion_token: null,
});
});
// it('should handle COMPOSE_SUGGESTIONS_READY', () => {
// const state = ImmutableMap({ default_privacy: 'public', privacy: 'public'});
// const action = {
// type: actions.COMPOSE_SUGGESTIONS_READY,
// };
// expect(reducer(state, action).toJS()).toMatchObject({
// default_privacy: 'unlisted',
// privacy: 'public',
// });
// });
//
// it('should handle COMPOSE_SUGGESTION_SELECT', () => {
// const state = ImmutableMap({ default_privacy: 'public', privacy: 'public'});
// const action = {
// type: actions.COMPOSE_SUGGESTION_SELECT,
// };
// expect(reducer(state, action).toJS()).toMatchObject({
// default_privacy: 'unlisted',
// privacy: 'public',
// });
// });
//
it('should handle COMPOSE_SUGGESTION_TAGS_UPDATE', () => {
const state = ImmutableMap({ tagHistory: [ 'hashtag' ] });
const action = {
type: actions.COMPOSE_SUGGESTION_TAGS_UPDATE,
token: 'aaadken3',
};
expect(reducer(state, action).toJS()).toMatchObject({
suggestion_token: 'aaadken3',
suggestions: [],
tagHistory: [ 'hashtag' ],
});
});
it('should handle COMPOSE_TAG_HISTORY_UPDATE', () => {
const state = ImmutableMap({ });
const action = {
type: actions.COMPOSE_TAG_HISTORY_UPDATE,
tags: [ 'hashtag', 'hashtag2'],
};
expect(reducer(state, action).toJS()).toMatchObject({
tagHistory: [ 'hashtag', 'hashtag2' ],
});
});
it('should handle TIMELINE_DELETE - delete status from timeline', () => {
const state = ImmutableMap({ in_reply_to: '9wk6pmImMrZjgrK7iC' });
const action = {
type: TIMELINE_DELETE,
id: '9wk6pmImMrZjgrK7iC',
};
expect(reducer(state, action).toJS()).toMatchObject({
in_reply_to: null,
});
});
// it('should handle COMPOSE_EMOJI_INSERT', () => {
// const state = ImmutableMap({ text: 'this is my' });
// const action = {
// type: actions.COMPOSE_EMOJI_INSERT,
// position: 11,
// emoji: [],
// needsSpace, true,
// };
// expect(reducer(state, action).toJS()).toMatchObject({
// text: 'this is my :emoji:',
// caretPosition: 15,
// });
// });
//
// it('should handle COMPOSE_UPLOAD_CHANGE_SUCCESS', () => {
// const state = ImmutableMap({ default_privacy: 'public' });
// const action = {
// type: actions.COMPOSE_UPLOAD_CHANGE_SUCCESS,
// };
// expect(reducer(state, action).toJS()).toMatchObject({
// default_privacy: 'unlisted',
// privacy: 'public',
// });
// });
//
// it('should handle REDRAFT', () => {
// const state = ImmutableMap({ default_privacy: 'public' });
// const action = {
// type: REDRAFT,
// };
// expect(reducer(state, action).toJS()).toMatchObject({
// default_privacy: 'unlisted',
// privacy: 'public',
// });
// });
//
it('should handle COMPOSE_POLL_ADD', () => {
const state = ImmutableMap({ poll: null });
const initialPoll = Object({
options: [
'',
'',
],
expires_in: 86400,
multiple: false,
});
const action = {
type: actions.COMPOSE_POLL_ADD,
};
expect(reducer(state, action).toJS()).toMatchObject({
poll: initialPoll,
});
});
it('should handle COMPOSE_POLL_REMOVE', () => {
const state = ImmutableMap({ });
const action = {
type: actions.COMPOSE_POLL_REMOVE,
};
expect(reducer(state, action).toJS()).toMatchObject({
poll: null,
});
});
// it('should handle COMPOSE_POLL_OPTION_ADD', () => {
// const initialPoll = Object({
// options: [
// 'option 1',
// 'option 2',
// ],
// expires_in: 86400,
// multiple: false
// });
// const state = ImmutableMap({ poll: initialPoll });
// const action = {
// type: actions.COMPOSE_POLL_OPTION_ADD,
// title: 'option 3',
// };
// const updatedPoll = Object({
// options: [
// 'option 1',
// 'option 2',
// 'option 3',
// ],
// expires_in: 86400,
// multiple: false,
// });
// expect(reducer(state, action).toJS()).toMatchObject({
// poll: updatedPoll,
// });
// });
it('should handle COMPOSE_POLL_OPTION_CHANGE', () => {
const initialPoll = Object({
options: [
'option 1',
'option 2',
],
expires_in: 86400,
multiple: false,
});
const state = ImmutableMap({ poll: initialPoll });
const action = {
type: actions.COMPOSE_POLL_OPTION_CHANGE,
index: 0,
title: 'change option',
};
const updatedPoll = Object({
options: [
'change option',
'option 2',
],
expires_in: 86400,
multiple: false,
});
expect(reducer(state, action).toJS()).toMatchObject({
poll: updatedPoll,
});
});
// it('should handle COMPOSE_POLL_OPTION_REMOVE', () => {
// const initialPoll = Object({
// options: [
// 'option 1',
// 'option 2',
// ],
// expires_in: 86400,
// multiple: false,
// });
// const state = ImmutableMap({ poll: initialPoll });
// const action = {
// type: actions.COMPOSE_POLL_OPTION_REMOVE,
// index: 1,
// };
// const updatedPoll = Object({
// options: [
// 'option 1',
// ],
// expires_in: 86400,
// multiple: false,
// });
// expect(reducer(state, action).toJS()).toMatchObject({
// poll: updatedPoll,
// });
// });
});

@ -1,5 +1,6 @@
import reducer from '../conversations';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import * as actions from 'soapbox/actions/conversations';
describe('conversations reducer', () => {
it('should return the initial state', () => {
@ -10,4 +11,55 @@ describe('conversations reducer', () => {
mounted: false,
}));
});
it('should handle CONVERSATIONS_FETCH_REQUEST', () => {
const state = ImmutableMap({ isLoading: false });
const action = {
type: actions.CONVERSATIONS_FETCH_REQUEST,
};
expect(reducer(state, action).toJS()).toMatchObject({
isLoading: true,
});
});
it('should handle CONVERSATIONS_FETCH_FAIL', () => {
const state = ImmutableMap({ isLoading: true });
const action = {
type: actions.CONVERSATIONS_FETCH_FAIL,
};
expect(reducer(state, action).toJS()).toMatchObject({
isLoading: false,
});
});
// it('should handle the Action CONVERSATIONS_MOUNT', () => {
// expect(
// reducer(
// {
// mounted: false,
// },
// {
// type: 'CONVERSATIONS_MOUNT',
// },
// ),
// ).toEqual({
// mounted: true,
// });
// });
//
// it('should handle the Action CONVERSATIONS_UNMOUNT', () => {
// expect(
// reducer(
// {
// mounted: true,
// },
// {
// type: 'CONVERSATIONS_UNMOUNT',
// },
// ),
// ).toEqual({
// mounted: false,
// });
// });
});

@ -1,8 +1,13 @@
import reducer from '../height_cache';
import { Map as ImmutableMap } from 'immutable';
import { HEIGHT_CACHE_CLEAR } from '../height_cache';
describe('height_cache reducer', () => {
it('should return the initial state', () => {
expect(reducer(undefined, {})).toEqual(ImmutableMap());
});
it('should handle HEIGHT_CACHE_CLEAR', () => {
expect(reducer(undefined, { type: HEIGHT_CACHE_CLEAR })).toEqual(ImmutableMap());
});
});

@ -1,8 +1,30 @@
import reducer from '../identity_proofs';
import { Map as ImmutableMap } from 'immutable';
import * as actions from 'soapbox/actions/identity_proofs';
describe('identity_proofs reducer', () => {
it('should return the initial state', () => {
expect(reducer(undefined, {})).toEqual(ImmutableMap());
});
it('should handle IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST', () => {
const state = ImmutableMap({ isLoading: false });
const action = {
type: actions.IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST,
};
expect(reducer(state, action).toJS()).toMatchObject({
isLoading: true,
});
});
it('should handle IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL', () => {
const state = ImmutableMap({ isLoading: true });
const action = {
type: actions.IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL,
};
expect(reducer(state, action).toJS()).toMatchObject({
isLoading: false,
});
});
});

@ -1,5 +1,6 @@
import reducer from '../list_adder';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import * as actions from 'soapbox/actions/lists';
describe('list_adder reducer', () => {
it('should return the initial state', () => {
@ -13,4 +14,101 @@ describe('list_adder reducer', () => {
}),
}));
});
it('should handle LIST_ADDER_RESET', () => {
const state = ImmutableMap({
accountId: null,
lists: ImmutableMap({
items: ImmutableList(),
loaded: false,
isLoading: false,
}),
});
const action = {
type: actions.LIST_ADDER_RESET,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
accountId: null,
lists: ImmutableMap({
items: ImmutableList(),
loaded: false,
isLoading: false,
}),
}));
});
it('should handle LIST_ADDER_LISTS_FETCH_REQUEST', () => {
const state = ImmutableMap({
accountId: null,
lists: ImmutableMap({
items: ImmutableList(),
loaded: false,
isLoading: false,
}),
});
const action = {
type: actions.LIST_ADDER_LISTS_FETCH_REQUEST,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
accountId: null,
lists: ImmutableMap({
items: ImmutableList(),
loaded: false,
isLoading: true,
}),
}));
});
it('should handle LIST_ADDER_LISTS_FETCH_FAIL', () => {
const state = ImmutableMap({
accountId: null,
lists: ImmutableMap({
items: ImmutableList(),
loaded: false,
isLoading: false,
}),
});
const action = {
type: actions.LIST_ADDER_LISTS_FETCH_FAIL,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
accountId: null,
lists: ImmutableMap({
items: ImmutableList(),
loaded: false,
isLoading: false,
}),
}));
});
// it('should handle LIST_ADDER_LISTS_FETCH_SUCCESS', () => {
// const state = ImmutableMap({
// accountId: null,
//
// lists: ImmutableMap({
// items: ImmutableList(),
// loaded: false,
// isLoading: false,
// }),
// });
// const action = {
// type: actions.LIST_ADDER_LISTS_FETCH_SUCCESS,
// };
// expect(reducer(state, action)).toEqual(ImmutableMap({
// accountId: null,
//
// lists: ImmutableMap({
// items: ImmutableList(),
// loaded: true,
// isLoading: false,
// }),
// }));
// });
});

@ -1,5 +1,6 @@
import reducer from '../list_editor';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import * as actions from 'soapbox/actions/lists';
describe('list_editor reducer', () => {
it('should return the initial state', () => {
@ -21,4 +22,131 @@ describe('list_editor reducer', () => {
}),
}));
});
it('should handle LIST_EDITOR_RESET', () => {
const state = ImmutableMap({
listId: null,
isSubmitting: false,
isChanged: false,
title: '',
accounts: ImmutableMap({
items: ImmutableList(),
loaded: false,
isLoading: false,
}),
suggestions: ImmutableMap({
value: '',
items: ImmutableList(),
}),
});
const action = {
type: actions.LIST_EDITOR_RESET,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
listId: null,
isSubmitting: false,
isChanged: false,
title: '',
accounts: ImmutableMap({
items: ImmutableList(),
loaded: false,
isLoading: false,
}),
suggestions: ImmutableMap({
value: '',
items: ImmutableList(),
}),
}));
});
it('should handle LIST_EDITOR_SETUP', () => {
const state = ImmutableMap({
listId: null,
isSubmitting: false,
isChanged: false,
title: '',
accounts: ImmutableMap({
items: ImmutableList(),
loaded: false,
isLoading: false,
}),
suggestions: ImmutableMap({
value: '',
items: ImmutableList(),
}),
});
const action = {
type: actions.LIST_EDITOR_SETUP,
list: ImmutableMap({
id: '22',
title: 'list 1',
}),
};
expect(reducer(state, action)).toEqual(ImmutableMap({
listId: '22',
isSubmitting: false,
isChanged: false,
title: 'list 1',
accounts: ImmutableMap({
items: ImmutableList(),
loaded: false,
isLoading: false,
}),
suggestions: ImmutableMap({
value: '',
items: ImmutableList(),
}),
}));
});
it('should handle LIST_EDITOR_TITLE_CHANGE', () => {
const state = ImmutableMap({
title: 'list 1',
isChanged: false,
});
const action = {
type: actions.LIST_EDITOR_TITLE_CHANGE,
value: 'list 1 edited',
};
expect(reducer(state, action).toJS()).toMatchObject({
isChanged: true,
title: 'list 1 edited',
});
});
it('should handle LIST_UPDATE_REQUEST', () => {
const state = ImmutableMap({
isSubmitting: false,
isChanged: true,
});
const action = {
type: actions.LIST_UPDATE_REQUEST,
};
expect(reducer(state, action).toJS()).toMatchObject({
isSubmitting: true,
isChanged: false,
});
});
it('should handle LIST_UPDATE_FAIL', () => {
debugger;
const state = ImmutableMap({
isSubmitting: true,
});
const action = {
type: actions.LIST_UPDATE_FAIL,
};
expect(reducer(state, action).toJS()).toMatchObject({
isSubmitting: false,
});
});
});

@ -1,4 +1,5 @@
import reducer from '../modal';
import { MODAL_OPEN, MODAL_CLOSE } from 'soapbox/actions/modal';
describe('modal reducer', () => {
it('should return the initial state', () => {
@ -7,4 +8,37 @@ describe('modal reducer', () => {
modalProps: {},
});
});
it('should handle MODAL_OPEN', () => {
const state = {
modalType: null,
modalProps: {},
};
const action = {
type: MODAL_OPEN,
modalType: 'type1',
modalProps: { props1: '1' },
};
debugger;
expect(reducer(state, action)).toMatchObject({
modalType: 'type1',
modalProps: { props1: '1' },
});
});
it('should handle MODAL_CLOSE', () => {
const state = {
modalType: 'type1',
modalProps: { props1: '1' },
};
const action = {
type: MODAL_CLOSE,
};
debugger;
expect(reducer(state, action)).toMatchObject({
modalType: null,
modalProps: {},
});
});
});

@ -1,5 +1,9 @@
import reducer from '../mutes';
import { Map as ImmutableMap } from 'immutable';
import {
MUTES_INIT_MODAL,
MUTES_TOGGLE_HIDE_NOTIFICATIONS,
} from 'soapbox/actions/mutes';
describe('mutes reducer', () => {
it('should return the initial state', () => {
@ -11,4 +15,42 @@ describe('mutes reducer', () => {
}),
}));
});
it('should handle MUTES_INIT_MODAL', () => {
const state = ImmutableMap({
new: ImmutableMap({
isSubmitting: false,
account: null,
notifications: true,
}),
});
const action = {
type: MUTES_INIT_MODAL,
account: 'account1',
};
expect(reducer(state, action)).toEqual(ImmutableMap({
new: ImmutableMap({
isSubmitting: false,
account: 'account1',
notifications: true,
}),
}));
});
it('should handle MUTES_TOGGLE_HIDE_NOTIFICATIONS', () => {
const state = ImmutableMap({
new: ImmutableMap({
notifications: true,
}),
});
const action = {
type: MUTES_TOGGLE_HIDE_NOTIFICATIONS,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
new: ImmutableMap({
notifications: false,
}),
}));
});
});

@ -1,10 +1,15 @@
import {
NOTIFICATIONS_EXPAND_SUCCESS,
} from 'soapbox/actions/notifications';
import * as actions from 'soapbox/actions/notifications';
import reducer from '../notifications';
import notifications from 'soapbox/__fixtures__/notifications.json';
import markers from 'soapbox/__fixtures__/markers.json';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import { take } from 'lodash';
import { SAVE_MARKERS_SUCCESS } from 'soapbox/actions/markers';
import { ACCOUNT_BLOCK_SUCCESS, ACCOUNT_MUTE_SUCCESS } from 'soapbox/actions/accounts';
import notification from 'soapbox/__fixtures__/notification.json';
import intlMessages from 'soapbox/__fixtures__/intlMessages.json';
import relationship from 'soapbox/__fixtures__/relationship.json';
import { TIMELINE_DELETE, TIMELINE_DISCONNECT } from 'soapbox/actions/timelines';
describe('notifications reducer', () => {
it('should return the initial state', () => {
@ -20,10 +25,10 @@ describe('notifications reducer', () => {
}));
});
test('NOTIFICATIONS_EXPAND_SUCCESS', () => {
it('should handle NOTIFICATIONS_EXPAND_SUCCESS', () => {
const state = undefined;
const action = {
type: NOTIFICATIONS_EXPAND_SUCCESS,
type: actions.NOTIFICATIONS_EXPAND_SUCCESS,
notifications: take(notifications, 3),
next: null,
skipLoading: true,
@ -68,4 +73,565 @@ describe('notifications reducer', () => {
}));
});
it('should handle SAVE_MARKERS_SUCCESS', () => {
const state = ImmutableMap({
unread: 1,
lastRead: '35098811',
});
const action = {
type: SAVE_MARKERS_SUCCESS,
markers: markers,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
unread: 3,
lastRead: '35098814',
}));
});
it('should handle NOTIFICATIONS_EXPAND_REQUEST', () => {
const state = ImmutableMap({
isLoading: false,
});
const action = {
type: actions.NOTIFICATIONS_EXPAND_REQUEST,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
isLoading: true,
}));
});
it('should handle NOTIFICATIONS_EXPAND_FAIL', () => {
const state = ImmutableMap({
isLoading: true,
});
const action = {
type: actions.NOTIFICATIONS_EXPAND_FAIL,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
isLoading: false,
}));
});
it('should handle NOTIFICATIONS_FILTER_SET', () => {
const state = ImmutableMap({
items: ImmutableList([
ImmutableMap({
id: '10744',
type: 'pleroma:emoji_reaction',
account: '9vMAje101ngtjlMj7w',
created_at: '2020-06-10T02:54:39.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: '😢',
is_seen: false,
}),
ImmutableMap({
id: '10743',
type: 'favourite',
account: '9v5c6xSEgAi3Zu1Lv6',
created_at: '2020-06-10T02:51:05.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
ImmutableMap({
id: '10741',
type: 'favourite',
account: '9v5cKMOPGqPcgfcWp6',
created_at: '2020-06-10T02:05:06.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
]),
hasMore: false,
top: false,
unread: 1,
isLoading: false,
queuedNotifications: ImmutableList(),
totalQueuedNotificationsCount: 0,
lastRead: -1,
});
const action = {
type: actions.NOTIFICATIONS_FILTER_SET,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
items: ImmutableList(),
hasMore: true,
top: false,
unread: 1,
isLoading: false,
queuedNotifications: ImmutableList(),
totalQueuedNotificationsCount: 0,
lastRead: -1,
}));
});
it('should handle NOTIFICATIONS_SCROLL_TOP by changing unread to 0 when top = true', () => {
const state = ImmutableMap({
unread: 1,
});
const action = {
type: actions.NOTIFICATIONS_SCROLL_TOP,
top: true,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
unread: 0,
top: true,
}));
});
it('should handle NOTIFICATIONS_SCROLL_TOP by not changing unread val when top = false', () => {
const state = ImmutableMap({
unread: 3,
});
const action = {
type: actions.NOTIFICATIONS_SCROLL_TOP,
top: false,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
unread: 3,
top: false,
}));
});
it('should handle NOTIFICATIONS_UPDATE, when top = false, increment unread', () => {
const state = ImmutableMap({
items: ImmutableList(),
top: false,
unread: 1,
});
const action = {
type: actions.NOTIFICATIONS_UPDATE,
notification: notification,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
items: ImmutableList([
ImmutableMap({
id: '10743',
type: 'favourite',
account: '9v5c6xSEgAi3Zu1Lv6',
created_at: '2020-06-10T02:51:05.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
]),
top: false,
unread: 2,
}));
});
it('should handle NOTIFICATIONS_UPDATE_QUEUE', () => {
const state = ImmutableMap({
items: ImmutableList([]),
queuedNotifications: ImmutableList([]),
totalQueuedNotificationsCount: 0,
});
const action = {
type: actions.NOTIFICATIONS_UPDATE_QUEUE,
notification: notification,
intlMessages: intlMessages,
intlLocale: 'en',
};
expect(reducer(state, action)).toEqual(ImmutableMap({
items: ImmutableList([]),
queuedNotifications: ImmutableList([{
notification: notification,
intlMessages: intlMessages,
intlLocale: 'en',
}]),
totalQueuedNotificationsCount: 1,
}));
});
it('should handle NOTIFICATIONS_DEQUEUE', () => {
const state = ImmutableMap({
items: ImmutableList([]),
queuedNotifications: take(notifications, 1),
totalQueuedNotificationsCount: 1,
});
const action = {
type: actions.NOTIFICATIONS_DEQUEUE,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
items: ImmutableList([]),
queuedNotifications: ImmutableList([]),
totalQueuedNotificationsCount: 0,
}));
});
it('should handle NOTIFICATIONS_EXPAND_SUCCESS with non-empty items and next set true', () => {
const state = ImmutableMap({
items: ImmutableList([
ImmutableMap({
id: '10734',
type: 'pleroma:emoji_reaction',
account: '9vMAje101ngtjlMj7w',
created_at: '2020-06-10T02:54:39.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: '😢',
is_seen: false,
}),
]),
unread: 1,
hasMore: true,
isLoading: false,
});
const action = {
type: actions.NOTIFICATIONS_EXPAND_SUCCESS,
notifications: take(notifications, 3),
next: true,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
items: ImmutableList([
ImmutableMap({
id: '10744',
type: 'pleroma:emoji_reaction',
account: '9vMAje101ngtjlMj7w',
created_at: '2020-06-10T02:54:39.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: '😢',
is_seen: false,
}),
ImmutableMap({
id: '10743',
type: 'favourite',
account: '9v5c6xSEgAi3Zu1Lv6',
created_at: '2020-06-10T02:51:05.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
ImmutableMap({
id: '10741',
type: 'favourite',
account: '9v5cKMOPGqPcgfcWp6',
created_at: '2020-06-10T02:05:06.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
ImmutableMap({
id: '10734',
type: 'pleroma:emoji_reaction',
account: '9vMAje101ngtjlMj7w',
created_at: '2020-06-10T02:54:39.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: '😢',
is_seen: false,
}),
]),
unread: 1,
hasMore: true,
isLoading: false,
}));
});
it('should handle NOTIFICATIONS_EXPAND_SUCCESS with empty items and next set true', () => {
const state = ImmutableMap({
items: ImmutableList([]),
unread: 1,
hasMore: true,
isLoading: false,
});
const action = {
type: actions.NOTIFICATIONS_EXPAND_SUCCESS,
notifications: take(notifications, 3),
next: true,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
items: ImmutableList([
ImmutableMap({
id: '10744',
type: 'pleroma:emoji_reaction',
account: '9vMAje101ngtjlMj7w',
created_at: '2020-06-10T02:54:39.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: '😢',
is_seen: false,
}),
ImmutableMap({
id: '10743',
type: 'favourite',
account: '9v5c6xSEgAi3Zu1Lv6',
created_at: '2020-06-10T02:51:05.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
ImmutableMap({
id: '10741',
type: 'favourite',
account: '9v5cKMOPGqPcgfcWp6',
created_at: '2020-06-10T02:05:06.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
]),
unread: 1,
hasMore: true,
isLoading: false,
}));
});
it('should handle ACCOUNT_BLOCK_SUCCESS', () => {
const state = ImmutableMap({
items: ImmutableList([
ImmutableMap({
id: '10744',
type: 'pleroma:emoji_reaction',
account: '9vMAje101ngtjlMj7w',
created_at: '2020-06-10T02:54:39.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: '😢',
is_seen: false,
}),
ImmutableMap({
id: '10743',
type: 'favourite',
account: '9v5c6xSEgAi3Zu1Lv6',
created_at: '2020-06-10T02:51:05.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
ImmutableMap({
id: '10741',
type: 'favourite',
account: '9v5cKMOPGqPcgfcWp6',
created_at: '2020-06-10T02:05:06.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
]),
});
const action = {
type: ACCOUNT_BLOCK_SUCCESS,
relationship: relationship,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
items: ImmutableList([
ImmutableMap({
id: '10743',
type: 'favourite',
account: '9v5c6xSEgAi3Zu1Lv6',
created_at: '2020-06-10T02:51:05.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
ImmutableMap({
id: '10741',
type: 'favourite',
account: '9v5cKMOPGqPcgfcWp6',
created_at: '2020-06-10T02:05:06.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
]),
}));
});
it('should handle ACCOUNT_MUTE_SUCCESS', () => {
const state = ImmutableMap({
items: ImmutableList([
ImmutableMap({
id: '10744',
type: 'pleroma:emoji_reaction',
account: '9vMAje101ngtjlMj7w',
created_at: '2020-06-10T02:54:39.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: '😢',
is_seen: false,
}),
ImmutableMap({
id: '10743',
type: 'favourite',
account: '9v5c6xSEgAi3Zu1Lv6',
created_at: '2020-06-10T02:51:05.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
ImmutableMap({
id: '10741',
type: 'favourite',
account: '9v5cKMOPGqPcgfcWp6',
created_at: '2020-06-10T02:05:06.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
]),
});
const action = {
type: ACCOUNT_MUTE_SUCCESS,
relationship: relationship,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
items: ImmutableList([
ImmutableMap({
id: '10743',
type: 'favourite',
account: '9v5c6xSEgAi3Zu1Lv6',
created_at: '2020-06-10T02:51:05.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
ImmutableMap({
id: '10741',
type: 'favourite',
account: '9v5cKMOPGqPcgfcWp6',
created_at: '2020-06-10T02:05:06.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
]),
}));
});
it('should handle NOTIFICATIONS_CLEAR', () => {
const state = ImmutableMap({
items: ImmutableList([]),
hasMore: true,
});
const action = {
type: actions.NOTIFICATIONS_CLEAR,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
items: ImmutableList([]),
hasMore: false,
}));
});
it('should handle NOTIFICATIONS_MARK_READ_REQUEST', () => {
const state = ImmutableMap({
items: ImmutableList([]),
});
const action = {
type: actions.NOTIFICATIONS_MARK_READ_REQUEST,
lastRead: 35098814,
};
expect(reducer(state, action)).toEqual(ImmutableMap({
items: ImmutableList([]),
lastRead: 35098814,
}));
});
it('should handle TIMELINE_DELETE', () => {
const state = ImmutableMap({
items: ImmutableList([
ImmutableMap({
id: '10744',
type: 'pleroma:emoji_reaction',
account: '9vMAje101ngtjlMj7w',
created_at: '2020-06-10T02:54:39.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: '😢',
is_seen: false,
}),
ImmutableMap({
id: '10743',
type: 'favourite',
account: '9v5c6xSEgAi3Zu1Lv6',
created_at: '2020-06-10T02:51:05.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
ImmutableMap({
id: '10741',
type: 'favourite',
account: '9v5cKMOPGqPcgfcWp6',
created_at: '2020-06-10T02:05:06.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
]),
});
const action = {
type: TIMELINE_DELETE,
id: '9vvNxoo5EFbbnfdXQu',
};
expect(reducer(state, action)).toEqual(ImmutableMap({
items: ImmutableList([]),
}));
});
it('should handle TIMELINE_DISCONNECT', () => {
const state = ImmutableMap({
items: ImmutableList([
ImmutableMap({
id: '10744',
type: 'pleroma:emoji_reaction',
account: '9vMAje101ngtjlMj7w',
created_at: '2020-06-10T02:54:39.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: '😢',
is_seen: false,
}),
ImmutableMap({
id: '10743',
type: 'favourite',
account: '9v5c6xSEgAi3Zu1Lv6',
created_at: '2020-06-10T02:51:05.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
ImmutableMap({
id: '10741',
type: 'favourite',
account: '9v5cKMOPGqPcgfcWp6',
created_at: '2020-06-10T02:05:06.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
]),
});
const action = {
type: TIMELINE_DISCONNECT,
timeline: 'home',
};
expect(reducer(state, action)).toEqual(ImmutableMap({
items: ImmutableList([
null,
ImmutableMap({
id: '10744',
type: 'pleroma:emoji_reaction',
account: '9vMAje101ngtjlMj7w',
created_at: '2020-06-10T02:54:39.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: '😢',
is_seen: false,
}),
ImmutableMap({
id: '10743',
type: 'favourite',
account: '9v5c6xSEgAi3Zu1Lv6',
created_at: '2020-06-10T02:51:05.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
ImmutableMap({
id: '10741',
type: 'favourite',
account: '9v5cKMOPGqPcgfcWp6',
created_at: '2020-06-10T02:05:06.000Z',
status: '9vvNxoo5EFbbnfdXQu',
emoji: undefined,
is_seen: true,
}),
]),
}));
});
});

Loading…
Cancel
Save