You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

345 lines
9.9 KiB

8 years ago
8 years ago
  1. require 'rails_helper'
  2. RSpec.describe Account, type: :model do
  3. subject { Fabricate(:account, username: 'alice') }
  4. context do
  5. let(:bob) { Fabricate(:account, username: 'bob') }
  6. describe '#follow!' do
  7. it 'creates a follow' do
  8. follow = subject.follow!(bob)
  9. expect(follow).to be_instance_of Follow
  10. expect(follow.account).to eq subject
  11. expect(follow.target_account).to eq bob
  12. end
  13. end
  14. describe '#unfollow!' do
  15. before do
  16. subject.follow!(bob)
  17. end
  18. it 'destroys a follow' do
  19. unfollow = subject.unfollow!(bob)
  20. expect(unfollow).to be_instance_of Follow
  21. expect(unfollow.account).to eq subject
  22. expect(unfollow.target_account).to eq bob
  23. expect(unfollow.destroyed?).to be true
  24. end
  25. end
  26. describe '#following?' do
  27. it 'returns true when the target is followed' do
  28. subject.follow!(bob)
  29. expect(subject.following?(bob)).to be true
  30. end
  31. it 'returns false if the target is not followed' do
  32. expect(subject.following?(bob)).to be false
  33. end
  34. end
  35. end
  36. describe '#local?' do
  37. it 'returns true when the account is local' do
  38. expect(subject.local?).to be true
  39. end
  40. it 'returns false when the account is on a different domain' do
  41. subject.domain = 'foreign.tld'
  42. expect(subject.local?).to be false
  43. end
  44. end
  45. describe '#acct' do
  46. it 'returns username for local users' do
  47. expect(subject.acct).to eql 'alice'
  48. end
  49. it 'returns username@domain for foreign users' do
  50. subject.domain = 'foreign.tld'
  51. expect(subject.acct).to eql 'alice@foreign.tld'
  52. end
  53. end
  54. describe '#subscribed?' do
  55. it 'returns false when no subscription expiration information is present' do
  56. expect(subject.subscribed?).to be false
  57. end
  58. it 'returns true when subscription expiration has been set' do
  59. subject.subscription_expires_at = 30.days.from_now
  60. expect(subject.subscribed?).to be true
  61. end
  62. end
  63. describe '#keypair' do
  64. it 'returns an RSA key pair' do
  65. expect(subject.keypair).to be_instance_of OpenSSL::PKey::RSA
  66. end
  67. end
  68. describe '#subscription' do
  69. it 'returns an OStatus subscription' do
  70. expect(subject.subscription('')).to be_instance_of OStatus2::Subscription
  71. end
  72. end
  73. describe '#object_type' do
  74. it 'is always a person' do
  75. expect(subject.object_type).to be :person
  76. end
  77. end
  78. describe '#ping!' do
  79. pending
  80. end
  81. describe '#favourited?' do
  82. let(:original_status) do
  83. author = Fabricate(:account, username: 'original')
  84. Fabricate(:status, account: author)
  85. end
  86. context 'when the status is a reblog of another status' do
  87. let(:original_reblog) do
  88. author = Fabricate(:account, username: 'original_reblogger')
  89. Fabricate(:status, reblog: original_status, account: author)
  90. end
  91. it 'is is true when this account has favourited it' do
  92. Fabricate(:favourite, status: original_reblog, account: subject)
  93. expect(subject.favourited?(original_status)).to eq true
  94. end
  95. it 'is false when this account has not favourited it' do
  96. expect(subject.favourited?(original_status)).to eq false
  97. end
  98. end
  99. context 'when the status is an original status' do
  100. it 'is is true when this account has favourited it' do
  101. Fabricate(:favourite, status: original_status, account: subject)
  102. expect(subject.favourited?(original_status)).to eq true
  103. end
  104. it 'is false when this account has not favourited it' do
  105. expect(subject.favourited?(original_status)).to eq false
  106. end
  107. end
  108. end
  109. describe '#reblogged?' do
  110. let(:original_status) do
  111. author = Fabricate(:account, username: 'original')
  112. Fabricate(:status, account: author)
  113. end
  114. context 'when the status is a reblog of another status'do
  115. let(:original_reblog) do
  116. author = Fabricate(:account, username: 'original_reblogger')
  117. Fabricate(:status, reblog: original_status, account: author)
  118. end
  119. it 'is true when this account has reblogged it' do
  120. Fabricate(:status, reblog: original_reblog, account: subject)
  121. expect(subject.reblogged?(original_reblog)).to eq true
  122. end
  123. it 'is false when this account has not reblogged it' do
  124. expect(subject.reblogged?(original_reblog)).to eq false
  125. end
  126. end
  127. context 'when the status is an original status' do
  128. it 'is true when this account has reblogged it' do
  129. Fabricate(:status, reblog: original_status, account: subject)
  130. expect(subject.reblogged?(original_status)).to eq true
  131. end
  132. it 'is false when this account has not reblogged it' do
  133. expect(subject.reblogged?(original_status)).to eq false
  134. end
  135. end
  136. end
  137. describe '.find_local' do
  138. before do
  139. Fabricate(:account, username: 'Alice')
  140. end
  141. it 'returns Alice for alice' do
  142. expect(Account.find_local('alice')).to_not be_nil
  143. end
  144. it 'returns Alice for Alice' do
  145. expect(Account.find_local('Alice')).to_not be_nil
  146. end
  147. it 'does not return anything for a_ice' do
  148. expect(Account.find_local('a_ice')).to be_nil
  149. end
  150. it 'does not return anything for al%' do
  151. expect(Account.find_local('al%')).to be_nil
  152. end
  153. end
  154. describe '.find_remote' do
  155. before do
  156. Fabricate(:account, username: 'Alice', domain: 'mastodon.social')
  157. end
  158. it 'returns Alice for alice@mastodon.social' do
  159. expect(Account.find_remote('alice', 'mastodon.social')).to_not be_nil
  160. end
  161. it 'returns Alice for ALICE@MASTODON.SOCIAL' do
  162. expect(Account.find_remote('ALICE', 'MASTODON.SOCIAL')).to_not be_nil
  163. end
  164. it 'does not return anything for a_ice@mastodon.social' do
  165. expect(Account.find_remote('a_ice', 'mastodon.social')).to be_nil
  166. end
  167. it 'does not return anything for alice@m_stodon.social' do
  168. expect(Account.find_remote('alice', 'm_stodon.social')).to be_nil
  169. end
  170. it 'does not return anything for alice@m%' do
  171. expect(Account.find_remote('alice', 'm%')).to be_nil
  172. end
  173. end
  174. describe '.following_map' do
  175. it 'returns an hash' do
  176. expect(Account.following_map([], 1)).to be_a Hash
  177. end
  178. end
  179. describe '.followed_by_map' do
  180. it 'returns an hash' do
  181. expect(Account.followed_by_map([], 1)).to be_a Hash
  182. end
  183. end
  184. describe '.blocking_map' do
  185. it 'returns an hash' do
  186. expect(Account.blocking_map([], 1)).to be_a Hash
  187. end
  188. end
  189. describe '.requested_map' do
  190. it 'returns an hash' do
  191. expect(Account.requested_map([], 1)).to be_a Hash
  192. end
  193. end
  194. describe 'MENTION_RE' do
  195. subject { Account::MENTION_RE }
  196. it 'matches usernames in the middle of a sentence' do
  197. expect(subject.match('Hello to @alice from me')[1]).to eq 'alice'
  198. end
  199. it 'matches usernames in the beginning of status' do
  200. expect(subject.match('@alice Hey how are you?')[1]).to eq 'alice'
  201. end
  202. it 'matches full usernames' do
  203. expect(subject.match('@alice@example.com')[1]).to eq 'alice@example.com'
  204. end
  205. it 'matches full usernames with a dot at the end' do
  206. expect(subject.match('Hello @alice@example.com.')[1]).to eq 'alice@example.com'
  207. end
  208. it 'matches dot-prepended usernames' do
  209. expect(subject.match('.@alice I want everybody to see this')[1]).to eq 'alice'
  210. end
  211. it 'does not match e-mails' do
  212. expect(subject.match('Drop me an e-mail at alice@example.com')).to be_nil
  213. end
  214. it 'does not match URLs' do
  215. expect(subject.match('Check this out https://medium.com/@alice/some-article#.abcdef123')).to be_nil
  216. end
  217. end
  218. describe 'validations' do
  219. it 'has a valid fabricator' do
  220. account = Fabricate.build(:account)
  221. account.valid?
  222. expect(account).to be_valid
  223. end
  224. it 'is invalid without a username' do
  225. account = Fabricate.build(:account, username: nil)
  226. account.valid?
  227. expect(account).to model_have_error_on_field(:username)
  228. end
  229. it 'is invalid if the username already exists' do
  230. account_1 = Fabricate(:account, username: 'the_doctor')
  231. account_2 = Fabricate.build(:account, username: 'the_doctor')
  232. account_2.valid?
  233. expect(account_2).to model_have_error_on_field(:username)
  234. end
  235. context 'when is local' do
  236. it 'is invalid if the username doesn\'t only contains letters, numbers and underscores' do
  237. account = Fabricate.build(:account, username: 'the-doctor')
  238. account.valid?
  239. expect(account).to model_have_error_on_field(:username)
  240. end
  241. it 'is invalid if the username is longer then 30 characters' do
  242. account = Fabricate.build(:account, username: Faker::Lorem.characters(31))
  243. account.valid?
  244. expect(account).to model_have_error_on_field(:username)
  245. end
  246. end
  247. end
  248. describe 'scopes' do
  249. describe 'remote' do
  250. it 'returns an array of accounts who have a domain' do
  251. account_1 = Fabricate(:account, domain: nil)
  252. account_2 = Fabricate(:account, domain: 'example.com')
  253. expect(Account.remote).to match_array([account_2])
  254. end
  255. end
  256. describe 'local' do
  257. it 'returns an array of accounts who do not have a domain' do
  258. account_1 = Fabricate(:account, domain: nil)
  259. account_2 = Fabricate(:account, domain: 'example.com')
  260. expect(Account.local).to match_array([account_1])
  261. end
  262. end
  263. describe 'silenced' do
  264. it 'returns an array of accounts who are silenced' do
  265. account_1 = Fabricate(:account, silenced: true)
  266. account_2 = Fabricate(:account, silenced: false)
  267. expect(Account.silenced).to match_array([account_1])
  268. end
  269. end
  270. describe 'suspended' do
  271. it 'returns an array of accounts who are suspended' do
  272. account_1 = Fabricate(:account, suspended: true)
  273. account_2 = Fabricate(:account, suspended: false)
  274. expect(Account.suspended).to match_array([account_1])
  275. end
  276. end
  277. end
  278. end