Skip to content

Commit f929fb4

Browse files
dks17MaicolBen
authored andcommitted
Tokens serialization (#1250)
1 parent c34495d commit f929fb4

File tree

3 files changed

+92
-21
lines changed

3 files changed

+92
-21
lines changed
Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,16 @@
1+
require_relative 'tokens_serialization'
2+
13
module DeviseTokenAuth::Concerns::ActiveRecordSupport
24
extend ActiveSupport::Concern
35

46
included do
5-
serialize :tokens, JSON unless tokens_has_json_column_type?
6-
7-
# can't set default on text fields in mysql, simulate here instead.
8-
after_save :set_empty_token_hash
9-
after_initialize :set_empty_token_hash
7+
serialize :tokens, DeviseTokenAuth::TokensSerialization
108
end
119

1210
class_methods do
1311
# It's abstract replacement .find_by
1412
def dta_find_by(attrs = {})
1513
find_by(attrs)
1614
end
17-
18-
protected
19-
20-
def tokens_has_json_column_type?
21-
database_exists? && table_exists? && columns_hash['tokens'] && columns_hash['tokens'].type.in?([:json, :jsonb])
22-
end
23-
24-
def database_exists?
25-
ActiveRecord::Base.connection_pool.with_connection { |con| con.active? } rescue false
26-
end
27-
end
28-
29-
protected
30-
31-
def set_empty_token_hash
32-
self.tokens ||= {} if has_attribute?(:tokens)
3315
end
3416
end
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
module DeviseTokenAuth::TokensSerialization
2+
# Serialization hash to json
3+
def self.dump(object)
4+
object.each_value(&:compact!) unless object.nil?
5+
JSON.generate(object)
6+
end
7+
8+
# Deserialization json to hash
9+
def self.load(json)
10+
case json
11+
when String
12+
JSON.parse(json)
13+
when NilClass
14+
{}
15+
else
16+
json
17+
end
18+
end
19+
end
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
require 'test_helper'
2+
3+
if DEVISE_TOKEN_AUTH_ORM == :active_record
4+
describe 'DeviseTokenAuth::TokensSerialization' do
5+
let(:ts) { DeviseTokenAuth::TokensSerialization }
6+
let(:user) { FactoryBot.create(:user) }
7+
let(:tokens) do
8+
# Сreate all possible token's attributes combinations
9+
user.create_token
10+
2.times { user.create_new_auth_token(user.tokens.first[0]) }
11+
user.create_new_auth_token
12+
user.create_token
13+
14+
user.tokens
15+
end
16+
let(:json) { JSON.generate(tokens) }
17+
18+
it 'is defined' do
19+
assert_equal(ts.present?, true)
20+
assert_kind_of(Module, ts)
21+
end
22+
23+
describe '.load(json)' do
24+
let(:default) { {} }
25+
26+
it 'is defined' do
27+
assert_respond_to(ts, :load)
28+
end
29+
30+
it 'handles nil' do
31+
assert_equal(ts.load(nil), default)
32+
end
33+
34+
it 'handles string' do
35+
assert_equal(ts.load(json), JSON.parse(json))
36+
end
37+
38+
it 'returns object of undesirable class' do
39+
assert_equal(ts.load([]), [])
40+
end
41+
end
42+
43+
describe '.dump(object)' do
44+
let(:default) { 'null' }
45+
46+
it 'is defined' do
47+
assert_respond_to(ts, :dump)
48+
end
49+
50+
it 'handles nil' do
51+
assert_equal(ts.dump(nil), default)
52+
end
53+
54+
it 'handles empty hash' do
55+
assert_equal(ts.dump({}), '{}')
56+
end
57+
58+
it 'deserialize tokens' do
59+
assert_equal(ts.dump(tokens), json)
60+
end
61+
62+
it 'removes nil values' do
63+
new_tokens = tokens.dup
64+
new_tokens[new_tokens.first[0]][:kos] = nil
65+
66+
assert_equal(ts.dump(tokens), ts.dump(new_tokens))
67+
end
68+
end
69+
end
70+
end

0 commit comments

Comments
 (0)