summaryrefslogtreecommitdiffstats
path: root/spec
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2016-03-20 13:03:06 +0100
committerEugen Rochko <eugen@zeonfederated.com>2016-03-20 13:03:06 +0100
commitb640f35621b419ae9b9e621e00a8a055068ce2f4 (patch)
tree430d9b5a442a427d07135b96ac0f71fd24d4aa99 /spec
parente14b76c7cb07c3ebc01a17991df9fe5b69d1b5bc (diff)
Writing out more tests, fixed some bugs
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/api/accounts_controller_spec.rb56
-rw-r--r--spec/controllers/api/follows_controller_spec.rb43
-rw-r--r--spec/controllers/api/salmon_controller_spec.rb30
-rw-r--r--spec/controllers/api/statuses_controller_spec.rb14
-rw-r--r--spec/controllers/api/subscriptions_controller_spec.rb33
-rw-r--r--spec/fixtures/push/feed.atom424
-rw-r--r--spec/fixtures/requests/.host-meta.txt19
-rw-r--r--spec/fixtures/requests/avatar.txtbin0 -> 109962 bytes
-rw-r--r--spec/fixtures/requests/feed.txt440
-rw-r--r--spec/fixtures/requests/webfinger.txt11
-rw-r--r--spec/fixtures/salmon/mention.xml2
-rw-r--r--spec/rails_helper.rb4
12 files changed, 1065 insertions, 11 deletions
diff --git a/spec/controllers/api/accounts_controller_spec.rb b/spec/controllers/api/accounts_controller_spec.rb
index 915a40a8a4f..7bcb1a788d2 100644
--- a/spec/controllers/api/accounts_controller_spec.rb
+++ b/spec/controllers/api/accounts_controller_spec.rb
@@ -1,27 +1,71 @@
require 'rails_helper'
RSpec.describe Api::AccountsController, type: :controller do
+ let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
+ let(:token) { double acceptable?: true, resource_owner_id: user.id }
+
+ before do
+ allow(controller).to receive(:doorkeeper_token) { token }
+ end
+
describe 'GET #show' do
- it 'returns http success'
+ it 'returns http success' do
+ get :show, id: user.account.id
+ expect(response).to have_http_status(:success)
+ end
end
describe 'GET #statuses' do
- it 'returns http success'
+ it 'returns http success' do
+ get :statuses, id: user.account.id
+ expect(response).to have_http_status(:success)
+ end
end
describe 'GET #followers' do
- it 'returns http success'
+ it 'returns http success' do
+ get :followers, id: user.account.id
+ expect(response).to have_http_status(:success)
+ end
end
describe 'GET #following' do
- it 'returns http success'
+ it 'returns http success' do
+ get :following, id: user.account.id
+ expect(response).to have_http_status(:success)
+ end
end
describe 'POST #follow' do
- it 'returns http success'
+ let(:other_account) { Fabricate(:account, username: 'bob') }
+
+ before do
+ post :follow, id: other_account.id
+ end
+
+ it 'returns http success' do
+ expect(response).to have_http_status(:success)
+ end
+
+ it 'creates a following relation between user and target user' do
+ expect(user.account.following?(other_account)).to be true
+ end
end
describe 'POST #unfollow' do
- it 'returns http success'
+ let(:other_account) { Fabricate(:account, username: 'bob') }
+
+ before do
+ user.account.follow!(other_account)
+ post :unfollow, id: other_account.id
+ end
+
+ it 'returns http success' do
+ expect(response).to have_http_status(:success)
+ end
+
+ it 'removes the following relation between user and target user' do
+ expect(user.account.following?(other_account)).to be false
+ end
end
end
diff --git a/spec/controllers/api/follows_controller_spec.rb b/spec/controllers/api/follows_controller_spec.rb
index 75f4701817f..e9bb1bfa535 100644
--- a/spec/controllers/api/follows_controller_spec.rb
+++ b/spec/controllers/api/follows_controller_spec.rb
@@ -1,7 +1,48 @@
require 'rails_helper'
RSpec.describe Api::FollowsController, type: :controller do
+ let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
+ let(:token) { double acceptable?: true, resource_owner_id: user.id }
+
+ before do
+ allow(controller).to receive(:doorkeeper_token) { token }
+ end
+
describe 'POST #create' do
- it 'returns http success'
+ before do
+ stub_request(:get, "https://quitter.no/.well-known/host-meta").to_return(request_fixture('.host-meta.txt'))
+ stub_request(:get, "https://quitter.no/.well-known/webfinger?resource=acct:gargron@quitter.no").to_return(request_fixture('webfinger.txt'))
+ stub_request(:get, "https://quitter.no/api/statuses/user_timeline/7477.atom").to_return(request_fixture('feed.txt'))
+ stub_request(:get, "https://quitter.no/avatar/7477-300-20160211190340.png").to_return(request_fixture('avatar.txt'))
+ stub_request(:post, "https://quitter.no/main/push/hub").to_return(:status => 200, :body => "", :headers => {})
+ stub_request(:post, "https://quitter.no/main/salmon/user/7477").to_return(:status => 200, :body => "", :headers => {})
+ stub_request(:post, "https://pubsubhubbub.superfeedr.com/").to_return(:status => 200, :body => "", :headers => {})
+
+ post :create, uri: 'gargron@quitter.no'
+ end
+
+ it 'returns http success' do
+ expect(response).to have_http_status(:success)
+ end
+
+ it 'creates account for remote user' do
+ expect(Account.find_by(username: 'gargron', domain: 'quitter.no')).to_not be_nil
+ end
+
+ it 'creates a follow relation between user and remote user' do
+ expect(user.account.following?(Account.find_by(username: 'gargron', domain: 'quitter.no'))).to be true
+ end
+
+ it 'sends a salmon slap to the remote user' do
+ expect(a_request(:post, "https://quitter.no/main/salmon/user/7477")).to have_been_made
+ end
+
+ it 'notifies own hub' do
+ expect(a_request(:post, "https://pubsubhubbub.superfeedr.com/")).to have_been_made
+ end
+
+ it 'subscribes to remote hub' do
+ expect(a_request(:post, "https://quitter.no/main/push/hub")).to have_been_made
+ end
end
end
diff --git a/spec/controllers/api/salmon_controller_spec.rb b/spec/controllers/api/salmon_controller_spec.rb
index e81ad12add5..d5be69c014e 100644
--- a/spec/controllers/api/salmon_controller_spec.rb
+++ b/spec/controllers/api/salmon_controller_spec.rb
@@ -1,7 +1,35 @@
require 'rails_helper'
RSpec.describe Api::SalmonController, type: :controller do
+ let(:account) { Fabricate(:account, username: 'catsrgr8', user: Fabricate(:user)) }
+
+ before do
+ stub_request(:get, "https://quitter.no/.well-known/host-meta").to_return(request_fixture('.host-meta.txt'))
+ stub_request(:get, "https://quitter.no/.well-known/webfinger?resource=acct:gargron@quitter.no").to_return(request_fixture('webfinger.txt'))
+ stub_request(:get, "https://quitter.no/api/statuses/user_timeline/7477.atom").to_return(request_fixture('feed.txt'))
+ stub_request(:get, "https://quitter.no/avatar/7477-300-20160211190340.png").to_return(request_fixture('avatar.txt'))
+ end
+
describe 'POST #update' do
- pending
+ before do
+ request.env['RAW_POST_DATA'] = File.read(File.join(Rails.root, 'spec', 'fixtures', 'salmon', 'mention.xml'))
+ post :update, id: account.id
+ end
+
+ it 'returns http success' do
+ expect(response).to have_http_status(:success)
+ end
+
+ it 'creates remote account' do
+ expect(Account.find_by(username: 'gargron', domain: 'quitter.no')).to_not be_nil
+ end
+
+ it 'creates status' do
+ expect(Status.find_by(uri: 'tag:quitter.no,2016-03-20:noticeId=1276923:objectType=note')).to_not be_nil
+ end
+
+ it 'creates mention for target account' do
+ expect(account.mentions.count).to eq 1
+ end
end
end
diff --git a/spec/controllers/api/statuses_controller_spec.rb b/spec/controllers/api/statuses_controller_spec.rb
index bd136a55987..75a8b999a3a 100644
--- a/spec/controllers/api/statuses_controller_spec.rb
+++ b/spec/controllers/api/statuses_controller_spec.rb
@@ -1,8 +1,20 @@
require 'rails_helper'
RSpec.describe Api::StatusesController, type: :controller do
+ let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
+ let(:token) { double acceptable?: true, resource_owner_id: user.id }
+
+ before do
+ allow(controller).to receive(:doorkeeper_token) { token }
+ end
+
describe 'GET #show' do
- it 'returns http success'
+ let(:status) { Fabricate(:status, account: user.account) }
+
+ it 'returns http success' do
+ get :show, id: status.id
+ expect(response).to have_http_status(:success)
+ end
end
describe 'GET #home' do
diff --git a/spec/controllers/api/subscriptions_controller_spec.rb b/spec/controllers/api/subscriptions_controller_spec.rb
index 16995c687da..e2f2ddd7ecf 100644
--- a/spec/controllers/api/subscriptions_controller_spec.rb
+++ b/spec/controllers/api/subscriptions_controller_spec.rb
@@ -1,11 +1,40 @@
require 'rails_helper'
RSpec.describe Api::SubscriptionsController, type: :controller do
+ let(:account) { Fabricate(:account, username: 'gargron', domain: 'quitter.no', verify_token: '123', remote_url: 'topic_url', secret: 'abc') }
+
describe 'GET #show' do
- pending
+ before do
+ get :show, id: account.id, 'hub.topic': 'topic_url', 'hub.verify_token': 123, 'hub.challenge': '456'
+ end
+
+ it 'returns http success' do
+ expect(response).to have_http_status(:success)
+ end
+
+ it 'echoes back the challenge' do
+ expect(response.body).to match '456'
+ end
end
describe 'POST #update' do
- pending
+ let(:feed) { File.read(File.join(Rails.root, 'spec', 'fixtures', 'push', 'feed.atom')) }
+
+ before do
+ stub_request(:get, "https://quitter.no/avatar/7477-300-20160211190340.png").to_return(request_fixture('avatar.txt'))
+
+ request.env['HTTP_X_HUB_SIGNATURE'] = "sha1=#{OpenSSL::HMAC.hexdigest('sha1', 'abc', feed)}"
+ request.env['RAW_POST_DATA'] = feed
+
+ post :update, id: account.id
+ end
+
+ it 'returns http created' do
+ expect(response).to have_http_status(:created)
+ end
+
+ it 'creates statuses for feed' do
+ expect(account.statuses.count).to_not eq 0
+ end
end
end
diff --git a/spec/fixtures/push/feed.atom b/spec/fixtures/push/feed.atom
new file mode 100644
index 00000000000..349df139d04
--- /dev/null
+++ b/spec/fixtures/push/feed.atom
@@ -0,0 +1,424 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
+ <generator uri="https://gnu.io/social" version="1.2.0-beta4">GNU social</generator>
+ <id>https://quitter.no/api/statuses/user_timeline/7477.atom</id>
+ <title>gargron timeline</title>
+ <subtitle>Updates from gargron on Quitter.no!</subtitle>
+ <logo>https://quitter.no/avatar/7477-96-20160211190340.png</logo>
+ <updated>2016-03-20T12:42:58+01:00</updated>
+<author>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <uri>https://quitter.no/user/7477</uri>
+ <name>gargron</name>
+ <summary>Software engineer, free time musician and DIGITAL SPORTS enthusiast. Likes cats. Warning: May contain memes</summary>
+ <link rel="alternate" type="text/html" href="https://quitter.no/gargron"/>
+ <link rel="avatar" type="image/png" media:width="300" media:height="300" href="https://quitter.no/avatar/7477-300-20160211190340.png"/>
+ <link rel="avatar" type="image/png" media:width="96" media:height="96" href="https://quitter.no/avatar/7477-96-20160211190340.png"/>
+ <link rel="avatar" type="image/png" media:width="48" media:height="48" href="https://quitter.no/avatar/7477-48-20160211190449.png"/>
+ <link rel="avatar" type="image/png" media:width="24" media:height="24" href="https://quitter.no/avatar/7477-24-20160211190517.png"/>
+ <poco:preferredUsername>gargron</poco:preferredUsername>
+ <poco:displayName>DIGITAL CAT</poco:displayName>
+ <poco:note>Software engineer, free time musician and DIGITAL SPORTS enthusiast. Likes cats. Warning: May contain memes</poco:note>
+ <poco:address>
+ <poco:formatted>Germany</poco:formatted>
+ </poco:address>
+ <poco:urls>
+ <poco:type>homepage</poco:type>
+ <poco:value>https://zeonfederated.com</poco:value>
+ <poco:primary>true</poco:primary>
+ </poco:urls>
+ <followers url="https://quitter.no/gargron/subscribers"></followers>
+ <statusnet:profile_info local_id="7477"></statusnet:profile_info>
+</author>
+ <link href="https://quitter.no/gargron" rel="alternate" type="text/html"/>
+ <link href="https://quitter.no/main/sup" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
+ <link href="https://quitter.no/api/statuses/user_timeline/7477.atom?max_id=1243309" rel="next" type="application/atom+xml"/>
+ <link href="https://quitter.no/main/push/hub" rel="hub"/>
+ <link href="https://quitter.no/main/salmon/user/7477" rel="salmon"/>
+ <link href="https://quitter.no/main/salmon/user/7477" rel="http://salmon-protocol.org/ns/salmon-replies"/>
+ <link href="https://quitter.no/main/salmon/user/7477" rel="http://salmon-protocol.org/ns/salmon-mention"/>
+ <link href="https://quitter.no/api/statuses/user_timeline/7477.atom" rel="self" type="application/atom+xml"/>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:quitter.no,2016-03-20:noticeId=1276923:objectType=note</id>
+ <title>New note by gargron</title>
+ <content type="html">@&lt;a href=&quot;https://cb6e6126.ngrok.io/users/catsrgr8&quot; class=&quot;h-card mention&quot;&gt;catsrgr8&lt;/a&gt; this is a mention</content>
+ <link rel="alternate" type="text/html" href="https://quitter.no/notice/1276923"/>
+ <status_net notice_id="1276923"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2016-03-20T11:05:31+00:00</published>
+ <updated>2016-03-20T11:05:31+00:00</updated>
+ <link rel="ostatus:conversation" href="tag:quitter.no,2016-03-20:objectType=thread:nonce=7c998112e39a6685"/>
+ <ostatus:conversation>tag:quitter.no,2016-03-20:objectType=thread:nonce=7c998112e39a6685</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://cb6e6126.ngrok.io/users/catsrgr8"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://quitter.no/api/statuses/show/1276923.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://quitter.no/api/statuses/show/1276923.atom"/>
+ <statusnet:notice_info local_id="1276923" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:quitter.no,2016-03-19:noticeId=1273635:objectType=note</id>
+ <title>New note by gargron</title>
+ <content type="html">Just testing a thing.</content>
+ <link rel="alternate" type="text/html" href="https://quitter.no/notice/1273635"/>
+ <status_net notice_id="1273635"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2016-03-19T20:35:53+00:00</published>
+ <updated>2016-03-19T20:35:53+00:00</updated>
+ <link rel="ostatus:conversation" href="tag:quitter.no,2016-03-19:objectType=thread:nonce=c4a61886d5cad4c2"/>
+ <ostatus:conversation>tag:quitter.no,2016-03-19:objectType=thread:nonce=c4a61886d5cad4c2</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/Gargron"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://quitter.no/api/statuses/show/1273635.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://quitter.no/api/statuses/show/1273635.atom"/>
+ <statusnet:notice_info local_id="1273635" source="web"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:quitter.no,2016-03-19:noticeId=1272988:objectType=note</id>
+ <title>Delete</title>
+ <content type="html">&lt;a href=&quot;https://quitter.no/gargron&quot;&gt;DIGITAL CAT&lt;/a&gt; deleted notice &lt;a href=&quot;https://quitter.no/notice/1272988&quot;&gt;{{tag:quitter.no,2016-03-19:noticeId=1272988:objectType=note}}&lt;/a&gt;.</content>
+ <link rel="alternate" type="text/html" href="https://quitter.no/notice/1273012"/>
+ <activity:verb>delete</activity:verb>
+ <published>2016-03-19T18:16:58+00:00</published>
+ <updated>2016-03-19T18:16:58+00:00</updated>
+ <activity:object>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:quitter.no,2016-03-19:noticeId=1272988:objectType=note</id>
+ </activity:object>
+ <link rel="ostatus:conversation" href="tag:quitter.no,2016-03-19:objectType=thread:nonce=7913e6b6256b6d0b"/>
+ <ostatus:conversation>tag:quitter.no,2016-03-19:objectType=thread:nonce=7913e6b6256b6d0b</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <activity:target>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+ <id>tag:quitter.no,2016-03-19:noticeId=1272988:objectType=note</id>
+ </activity:target>
+ <link rel="self" type="application/atom+xml" href="https://quitter.no/api/statuses/show/1273012.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://quitter.no/api/statuses/show/1273012.atom"/>
+ <statusnet:notice_info local_id="1273012" source="unknown"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:quitter.no,2016-03-19:noticeId=1269381:objectType=comment</id>
+ <title>New comment by gargron</title>
+ <content type="html">@&lt;a href=&quot;https://mastodon.social/users/Gargron&quot; class=&quot;h-card mention&quot; title=&quot;Eugen&quot;&gt;gargron&lt;/a&gt; I have to wonder if this will appear as a reply to the right status, and not just a mention.</content>
+ <link rel="alternate" type="text/html" href="https://quitter.no/notice/1269381"/>
+ <status_net notice_id="1269381"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2016-03-19T00:10:14+00:00</published>
+ <updated>2016-03-19T00:10:14+00:00</updated>
+ <thr:in-reply-to ref="tag:mastodon.social,2016-03-18:objectId=60:objectType=Status" href="https://quitter.no/notice/1269244"></thr:in-reply-to>
+ <link rel="related" href="https://quitter.no/notice/1269244"/>
+ <link rel="ostatus:conversation" href="tag:quitter.no,2016-03-18:objectType=thread:nonce=d05c6330fbe23fb9"/>
+ <ostatus:conversation>tag:quitter.no,2016-03-18:objectType=thread:nonce=d05c6330fbe23fb9</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/Gargron"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://quitter.no/api/statuses/show/1269381.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://quitter.no/api/statuses/show/1269381.atom"/>
+ <statusnet:notice_info local_id="1269381" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:quitter.no,2016-03-18:noticeId=1265337:objectType=comment</id>
+ <title>New comment by gargron</title>
+ <content type="html">@&lt;a href=&quot;https://community.highlandarrow.com/user/1&quot; class=&quot;h-card mention&quot; title=&quot;Maiyannah Bishop&quot;&gt;maiyannah&lt;/a&gt; Plus, Android can hardly be considered free software given how many proprietary blobs are used. I'm speaking as a disappointed Android user.</content>
+ <link rel="alternate" type="text/html" href="https://quitter.no/notice/1265337"/>
+ <status_net notice_id="1265337"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2016-03-18T10:01:50+00:00</published>
+ <updated>2016-03-18T10:01:50+00:00</updated>
+ <thr:in-reply-to ref="tag:quitter.no,2016-03-18:noticeId=1265331:objectType=comment" href="https://quitter.no/notice/1265331"></thr:in-reply-to>
+ <link rel="related" href="https://quitter.no/notice/1265331"/>
+ <link rel="ostatus:conversation" href="tag:community.highlandarrow.com,2016-03-18:objectType=thread:nonce=d61438407b882959"/>
+ <ostatus:conversation>tag:community.highlandarrow.com,2016-03-18:objectType=thread:nonce=d61438407b882959</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://quitter.no/user/7477"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://community.highlandarrow.com/user/1"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://quitter.no/api/statuses/show/1265337.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://quitter.no/api/statuses/show/1265337.atom"/>
+ <statusnet:notice_info local_id="1265337" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:quitter.no,2016-03-18:noticeId=1265331:objectType=comment</id>
+ <title>New comment by gargron</title>
+ <content type="html">@&lt;a href=&quot;https://community.highlandarrow.com/user/1&quot; class=&quot;h-card mention&quot; title=&quot;Maiyannah Bishop&quot;&gt;maiyannah&lt;/a&gt; Well as it turns out, Apple software is better than Android in terms of security, and Apple is fighting FBI while Google promised to build a messaging app that facilitates wire tapping. The whole free software thing should imo be considered a bonus and not overshadow other factors.</content>
+ <link rel="alternate" type="text/html" href="https://quitter.no/notice/1265331"/>
+ <status_net notice_id="1265331"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2016-03-18T10:01:01+00:00</published>
+ <updated>2016-03-18T10:01:01+00:00</updated>
+ <thr:in-reply-to ref="tag:community.highlandarrow.com,2016-03-18:noticeId=54411:objectType=note" href="https://community.highlandarrow.com/notice/54411"></thr:in-reply-to>
+ <link rel="related" href="https://community.highlandarrow.com/notice/54411"/>
+ <link rel="ostatus:conversation" href="tag:community.highlandarrow.com,2016-03-18:objectType=thread:nonce=d61438407b882959"/>
+ <ostatus:conversation>tag:community.highlandarrow.com,2016-03-18:objectType=thread:nonce=d61438407b882959</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://community.highlandarrow.com/user/1"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://quitter.no/api/statuses/show/1265331.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://quitter.no/api/statuses/show/1265331.atom"/>
+ <statusnet:notice_info local_id="1265331" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
+ <id>tag:quitter.no,2016-03-17:noticeId=1261358:objectType=comment</id>
+ <title>New comment by gargron</title>
+ <content type="html">@&lt;a href=&quot;https://community.highlandarrow.com/user/1&quot; class=&quot;h-card mention&quot; title=&quot;Maiyannah Bishop&quot;&gt;maiyannah&lt;/a&gt; @&lt;a href=&quot;https://gs.kawa-kun.com/user/2&quot; class=&quot;h-card mention&quot; title=&quot;&amp;#x7AF9;&amp;#x4E0B;&amp;#x61B2;&amp;#x4E8C;&quot;&gt;takeshitakenji&lt;/a&gt; There is a reason that was deprecated and we don't use tables to design websites anymore. HTML needs to be semantic, i.e. tags need to describe the *kind* of content, not how it should *look*, which is a responsibility delegated to CSS. There are so many upsides to this separation of concerns, should I start listing?</content>
+ <link rel="alternate" type="text/html" href="https://quitter.no/notice/1261358"/>
+ <status_net notice_id="1261358"></status_net>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2016-03-17T17:00:26+00:00</published>
+ <updated>2016-03-17T17:00:26+00:00</updated>
+ <thr:in-reply-to ref="tag:community.highlandarrow.com,2016-03-17:noticeId=53857:objectType=comment" href="https://community.highlandarrow.com/notice/53857"></thr:in-reply-to>
+ <link rel="related" href="https://community.highlandarrow.com/notice/53857"/>
+ <link rel="ostatus:conversation" href="tag:gs.kawa-kun.com,2016-03-17:objectType=thread:nonce=a83963573a0520f1"/>
+ <ostatus:conversation>tag:gs.kawa-kun.com,2016-03-17:objectType=thread:nonce=a83963573a0520f1</ostatus:conversation>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://community.highlandarrow.com/user/1"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://gs.kawa-kun.com/user/2"/>
+ <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
+ <link rel="self" type="application/atom+xml" href="https://quitter.no/api/statuses/show/1261358.atom"/>
+ <link rel="edit" type="application/atom+xml" href="https://quitter.no/api/statuses/show/1261358.atom"/>
+ <statusnet:notice_info local_id="1261358" source="Qvitter"></statusnet:notice_info>
+</entry>
+<entry>
+ <id>tag:quitter.no,2016-03-16:subscription:7477:person:15743:2016-03-16T21:24:13+01:00</id>
+ <title>DIGITAL CAT (gargron)'s status on Wednesday, 16-Mar-2016 21:24:13 CET</title>
+ <content type="html">&lt;a href=&quot;https://quitter.no/gargron&quot;&gt;DIGITAL CAT&lt;/a&gt; started following &lt;a href=&quot;https://mastodon.social/users/Gargron&quot;&gt;Eugen&lt;/a&