tag_manager_spec.rb 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. # frozen_string_literal: true
  2. require 'rails_helper'
  3. RSpec.describe ActivityPub::TagManager do
  4. include RoutingHelper
  5. subject { described_class.instance }
  6. describe '#url_for' do
  7. it 'returns a string' do
  8. account = Fabricate(:account)
  9. expect(subject.url_for(account)).to be_a String
  10. end
  11. end
  12. describe '#uri_for' do
  13. it 'returns a string' do
  14. account = Fabricate(:account)
  15. expect(subject.uri_for(account)).to be_a String
  16. end
  17. end
  18. describe '#to' do
  19. it 'returns public collection for public status' do
  20. status = Fabricate(:status, visibility: :public)
  21. expect(subject.to(status)).to eq ['https://www.w3.org/ns/activitystreams#Public']
  22. end
  23. it 'returns followers collection for unlisted status' do
  24. status = Fabricate(:status, visibility: :unlisted)
  25. expect(subject.to(status)).to eq [account_followers_url(status.account)]
  26. end
  27. it 'returns followers collection for private status' do
  28. status = Fabricate(:status, visibility: :private)
  29. expect(subject.to(status)).to eq [account_followers_url(status.account)]
  30. end
  31. it 'returns URIs of mentions for direct status' do
  32. status = Fabricate(:status, visibility: :direct)
  33. mentioned = Fabricate(:account)
  34. status.mentions.create(account: mentioned)
  35. expect(subject.to(status)).to eq [subject.uri_for(mentioned)]
  36. end
  37. it "returns URIs of mentioned group's followers for direct statuses to groups" do
  38. status = Fabricate(:status, visibility: :direct)
  39. mentioned = Fabricate(:account, domain: 'remote.org', uri: 'https://remote.org/group', followers_url: 'https://remote.org/group/followers', actor_type: 'Group')
  40. status.mentions.create(account: mentioned)
  41. expect(subject.to(status)).to include(subject.uri_for(mentioned))
  42. expect(subject.to(status)).to include(subject.followers_uri_for(mentioned))
  43. end
  44. it "returns URIs of mentions for direct silenced author's status only if they are followers or requesting to be" do
  45. bob = Fabricate(:account, username: 'bob')
  46. alice = Fabricate(:account, username: 'alice')
  47. foo = Fabricate(:account)
  48. author = Fabricate(:account, username: 'author', silenced: true)
  49. status = Fabricate(:status, visibility: :direct, account: author)
  50. bob.follow!(author)
  51. FollowRequest.create!(account: foo, target_account: author)
  52. status.mentions.create(account: alice)
  53. status.mentions.create(account: bob)
  54. status.mentions.create(account: foo)
  55. expect(subject.to(status)).to include(subject.uri_for(bob))
  56. expect(subject.to(status)).to include(subject.uri_for(foo))
  57. expect(subject.to(status)).to_not include(subject.uri_for(alice))
  58. end
  59. end
  60. describe '#cc' do
  61. it 'returns followers collection for public status' do
  62. status = Fabricate(:status, visibility: :public)
  63. expect(subject.cc(status)).to eq [account_followers_url(status.account)]
  64. end
  65. it 'returns public collection for unlisted status' do
  66. status = Fabricate(:status, visibility: :unlisted)
  67. expect(subject.cc(status)).to eq ['https://www.w3.org/ns/activitystreams#Public']
  68. end
  69. it 'returns empty array for private status' do
  70. status = Fabricate(:status, visibility: :private)
  71. expect(subject.cc(status)).to eq []
  72. end
  73. it 'returns empty array for direct status' do
  74. status = Fabricate(:status, visibility: :direct)
  75. expect(subject.cc(status)).to eq []
  76. end
  77. it 'returns URIs of mentions for non-direct status' do
  78. status = Fabricate(:status, visibility: :public)
  79. mentioned = Fabricate(:account)
  80. status.mentions.create(account: mentioned)
  81. expect(subject.cc(status)).to include(subject.uri_for(mentioned))
  82. end
  83. it "returns URIs of mentions for silenced author's non-direct status only if they are followers or requesting to be" do
  84. bob = Fabricate(:account, username: 'bob')
  85. alice = Fabricate(:account, username: 'alice')
  86. foo = Fabricate(:account)
  87. author = Fabricate(:account, username: 'author', silenced: true)
  88. status = Fabricate(:status, visibility: :public, account: author)
  89. bob.follow!(author)
  90. FollowRequest.create!(account: foo, target_account: author)
  91. status.mentions.create(account: alice)
  92. status.mentions.create(account: bob)
  93. status.mentions.create(account: foo)
  94. expect(subject.cc(status)).to include(subject.uri_for(bob))
  95. expect(subject.cc(status)).to include(subject.uri_for(foo))
  96. expect(subject.cc(status)).to_not include(subject.uri_for(alice))
  97. end
  98. end
  99. describe '#local_uri?' do
  100. it 'returns false for non-local URI' do
  101. expect(subject.local_uri?('http://example.com/123')).to be false
  102. end
  103. it 'returns true for local URIs' do
  104. account = Fabricate(:account)
  105. expect(subject.local_uri?(subject.uri_for(account))).to be true
  106. end
  107. end
  108. describe '#uri_to_local_id' do
  109. it 'returns the local ID' do
  110. account = Fabricate(:account)
  111. expect(subject.uri_to_local_id(subject.uri_for(account), :username)).to eq account.username
  112. end
  113. end
  114. describe '#uri_to_resource' do
  115. it 'returns the local account' do
  116. account = Fabricate(:account)
  117. expect(subject.uri_to_resource(subject.uri_for(account), Account)).to eq account
  118. end
  119. it 'returns the remote account by matching URI without fragment part' do
  120. account = Fabricate(:account, uri: 'https://example.com/123', domain: 'example.com')
  121. expect(subject.uri_to_resource('https://example.com/123#456', Account)).to eq account
  122. end
  123. it 'returns the local status for ActivityPub URI' do
  124. status = Fabricate(:status)
  125. expect(subject.uri_to_resource(subject.uri_for(status), Status)).to eq status
  126. end
  127. it 'returns the local status for OStatus tag: URI' do
  128. status = Fabricate(:status)
  129. expect(subject.uri_to_resource(OStatus::TagManager.instance.uri_for(status), Status)).to eq status
  130. end
  131. it 'returns the remote status by matching URI without fragment part' do
  132. status = Fabricate(:status, uri: 'https://example.com/123')
  133. expect(subject.uri_to_resource('https://example.com/123#456', Status)).to eq status
  134. end
  135. end
  136. end