Merge remote-tracking branch 'origin/main'
This commit is contained in:
commit
5c2c046a7a
|
@ -104,7 +104,7 @@ jobs:
|
|||
yarn install --frozen-lockfile
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
- name: stylelint
|
||||
uses: reviewdog/action-stylelint@v1.26.0
|
||||
uses: reviewdog/action-stylelint@v1.28.0
|
||||
with:
|
||||
github_token: ${{ secrets.github_token }}
|
||||
reporter: github-pr-check
|
||||
|
|
2
Gemfile
2
Gemfile
|
@ -94,7 +94,7 @@ group :development, :test do
|
|||
gem "rspec-mocks"
|
||||
gem "rspec-rails", "~> 6.1"
|
||||
gem "rspec-sidekiq", "~> 5.0", require: false
|
||||
gem "rubocop", "~> 1.64"
|
||||
gem "rubocop", "~> 1.65"
|
||||
gem "rubocop-rails", "~> 2.25"
|
||||
gem "shoulda-matchers", "~> 6.2"
|
||||
gem "simplecov", require: false
|
||||
|
|
89
Gemfile.lock
89
Gemfile.lock
|
@ -87,8 +87,8 @@ GEM
|
|||
i18n (>= 1.6, < 2)
|
||||
minitest (>= 5.1)
|
||||
tzinfo (~> 2.0)
|
||||
addressable (2.8.6)
|
||||
public_suffix (>= 2.0.2, < 6.0)
|
||||
addressable (2.8.7)
|
||||
public_suffix (>= 2.0.2, < 7.0)
|
||||
ast (2.4.2)
|
||||
base64 (0.2.0)
|
||||
bcrypt (3.1.20)
|
||||
|
@ -105,7 +105,7 @@ GEM
|
|||
actionpack (>= 6.1)
|
||||
activemodel (>= 6.1)
|
||||
builder (3.3.0)
|
||||
bullet (7.1.6)
|
||||
bullet (7.2.0)
|
||||
activesupport (>= 3.0.0)
|
||||
uniform_notifier (~> 1.11)
|
||||
carrierwave (2.1.1)
|
||||
|
@ -124,7 +124,7 @@ GEM
|
|||
concurrent-ruby (1.3.3)
|
||||
connection_pool (2.4.1)
|
||||
crass (1.0.6)
|
||||
cssbundling-rails (1.4.0)
|
||||
cssbundling-rails (1.4.1)
|
||||
railties (>= 6.0.0)
|
||||
csv (3.3.0)
|
||||
database_cleaner (2.0.2)
|
||||
|
@ -169,9 +169,9 @@ GEM
|
|||
dry-logic (~> 1.4)
|
||||
zeitwerk (~> 2.6)
|
||||
erubi (1.13.0)
|
||||
et-orbi (1.2.7)
|
||||
et-orbi (1.2.11)
|
||||
tzinfo
|
||||
excon (0.110.0)
|
||||
excon (0.111.0)
|
||||
factory_bot (6.4.5)
|
||||
activesupport (>= 5.0.0)
|
||||
factory_bot_rails (6.4.3)
|
||||
|
@ -180,14 +180,14 @@ GEM
|
|||
fake_email_validator (1.0.11)
|
||||
activemodel
|
||||
mail
|
||||
faker (3.4.1)
|
||||
faker (3.4.2)
|
||||
i18n (>= 1.8.11, < 2)
|
||||
ffi (1.16.3)
|
||||
fog-aws (3.23.0)
|
||||
fog-aws (3.24.0)
|
||||
fog-core (~> 2.1)
|
||||
fog-json (~> 1.1)
|
||||
fog-xml (~> 0.1)
|
||||
fog-core (2.4.0)
|
||||
fog-core (2.5.0)
|
||||
builder
|
||||
excon (~> 0.71)
|
||||
formatador (>= 0.2, < 2.0)
|
||||
|
@ -201,8 +201,8 @@ GEM
|
|||
fog-core
|
||||
nokogiri (>= 1.5.11, < 2.0.0)
|
||||
formatador (1.1.0)
|
||||
fugit (1.9.0)
|
||||
et-orbi (~> 1, >= 1.2.7)
|
||||
fugit (1.11.0)
|
||||
et-orbi (~> 1, >= 1.2.11)
|
||||
raabro (~> 1.4)
|
||||
glob (0.4.0)
|
||||
globalid (1.2.1)
|
||||
|
@ -232,10 +232,10 @@ GEM
|
|||
image_processing (1.12.2)
|
||||
mini_magick (>= 4.9.5, < 5)
|
||||
ruby-vips (>= 2.0.17, < 3)
|
||||
jsbundling-rails (1.3.0)
|
||||
jsbundling-rails (1.3.1)
|
||||
railties (>= 6.0.0)
|
||||
json (2.7.2)
|
||||
json-schema (4.3.0)
|
||||
json-schema (4.3.1)
|
||||
addressable (>= 2.8)
|
||||
jwt (2.8.2)
|
||||
base64
|
||||
|
@ -271,14 +271,14 @@ GEM
|
|||
method_source (1.1.0)
|
||||
mime-types (3.5.2)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2024.0604)
|
||||
mime-types-data (3.2024.0702)
|
||||
mimemagic (0.4.3)
|
||||
nokogiri (~> 1)
|
||||
rake
|
||||
mini_magick (4.13.1)
|
||||
mini_magick (4.13.2)
|
||||
mini_mime (1.1.5)
|
||||
mini_portile2 (2.8.7)
|
||||
minitest (5.24.0)
|
||||
minitest (5.24.1)
|
||||
msgpack (1.7.2)
|
||||
multi_json (1.15.0)
|
||||
multi_xml (0.7.1)
|
||||
|
@ -297,29 +297,30 @@ GEM
|
|||
timeout
|
||||
net-smtp (0.5.0)
|
||||
net-protocol
|
||||
nio4r (2.7.0)
|
||||
nokogiri (1.16.6)
|
||||
nio4r (2.7.3)
|
||||
nokogiri (1.16.7)
|
||||
mini_portile2 (~> 2.8.2)
|
||||
racc (~> 1.4)
|
||||
oj (3.16.4)
|
||||
bigdecimal (>= 3.0)
|
||||
openssl (3.2.0)
|
||||
orm_adapter (0.5.0)
|
||||
parallel (1.24.0)
|
||||
parser (3.3.2.0)
|
||||
parallel (1.25.1)
|
||||
parser (3.3.4.0)
|
||||
ast (~> 2.4.1)
|
||||
racc
|
||||
pg (1.5.6)
|
||||
pg (1.5.7)
|
||||
pghero (3.5.0)
|
||||
activerecord (>= 6)
|
||||
prometheus-client (4.2.2)
|
||||
public_suffix (5.0.4)
|
||||
prometheus-client (4.2.3)
|
||||
base64
|
||||
public_suffix (6.0.1)
|
||||
puma (6.4.2)
|
||||
nio4r (~> 2.0)
|
||||
pundit (2.3.2)
|
||||
activesupport (>= 3.0.0)
|
||||
raabro (1.4.0)
|
||||
racc (1.8.0)
|
||||
racc (1.8.1)
|
||||
rack (2.2.9)
|
||||
rack-test (2.1.0)
|
||||
rack (>= 1.3)
|
||||
|
@ -351,7 +352,7 @@ GEM
|
|||
rails-i18n (7.0.9)
|
||||
i18n (>= 0.7, < 2)
|
||||
railties (>= 6.0.0, < 8)
|
||||
rails_admin (3.1.2)
|
||||
rails_admin (3.1.4)
|
||||
activemodel-serializers-xml (>= 1.0)
|
||||
kaminari (>= 0.14, < 2.0)
|
||||
nested_form (~> 0.3)
|
||||
|
@ -374,8 +375,8 @@ GEM
|
|||
responders (3.1.1)
|
||||
actionpack (>= 5.2)
|
||||
railties (>= 5.2)
|
||||
rexml (3.2.8)
|
||||
strscan (>= 3.0.9)
|
||||
rexml (3.3.4)
|
||||
strscan
|
||||
rolify (6.0.1)
|
||||
rotp (6.3.0)
|
||||
rouge (4.1.3)
|
||||
|
@ -418,20 +419,20 @@ GEM
|
|||
rspec-mocks (~> 3.0)
|
||||
sidekiq (>= 5, < 8)
|
||||
rspec-support (3.13.1)
|
||||
rubocop (1.64.1)
|
||||
rubocop (1.65.1)
|
||||
json (~> 2.3)
|
||||
language_server-protocol (>= 3.17.0)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.3.0.2)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 1.8, < 3.0)
|
||||
regexp_parser (>= 2.4, < 3.0)
|
||||
rexml (>= 3.2.5, < 4.0)
|
||||
rubocop-ast (>= 1.31.1, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 2.4.0, < 3.0)
|
||||
rubocop-ast (1.31.3)
|
||||
rubocop-ast (1.32.0)
|
||||
parser (>= 3.3.1.0)
|
||||
rubocop-rails (2.25.0)
|
||||
rubocop-rails (2.25.1)
|
||||
activesupport (>= 4.2.0)
|
||||
rack (>= 1.1)
|
||||
rubocop (>= 1.33.0, < 2.0)
|
||||
|
@ -442,7 +443,7 @@ GEM
|
|||
rubyzip (2.3.2)
|
||||
rufus-scheduler (3.9.1)
|
||||
fugit (~> 1.1, >= 1.1.6)
|
||||
sanitize (6.1.1)
|
||||
sanitize (6.1.2)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.12.0)
|
||||
sassc (2.4.0)
|
||||
|
@ -453,14 +454,14 @@ GEM
|
|||
sprockets (> 3.0)
|
||||
sprockets-rails
|
||||
tilt
|
||||
sentry-rails (5.17.3)
|
||||
sentry-rails (5.18.2)
|
||||
railties (>= 5.0)
|
||||
sentry-ruby (~> 5.17.3)
|
||||
sentry-ruby (5.17.3)
|
||||
sentry-ruby (~> 5.18.2)
|
||||
sentry-ruby (5.18.2)
|
||||
bigdecimal
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
sentry-sidekiq (5.17.3)
|
||||
sentry-ruby (~> 5.17.3)
|
||||
sentry-sidekiq (5.18.2)
|
||||
sentry-ruby (~> 5.18.2)
|
||||
sidekiq (>= 3.0)
|
||||
shoulda-matchers (6.2.0)
|
||||
activesupport (>= 5.2.0)
|
||||
|
@ -468,10 +469,10 @@ GEM
|
|||
connection_pool (>= 2.2.5, < 3)
|
||||
rack (~> 2.0)
|
||||
redis (>= 4.5.0, < 5)
|
||||
sidekiq-scheduler (5.0.3)
|
||||
sidekiq-scheduler (5.0.6)
|
||||
rufus-scheduler (~> 3.2)
|
||||
sidekiq (>= 6, < 8)
|
||||
tilt (>= 1.4.0)
|
||||
tilt (>= 1.4.0, < 3)
|
||||
simplecov (0.22.0)
|
||||
docile (~> 1.1)
|
||||
simplecov-html (~> 0.11)
|
||||
|
@ -487,7 +488,7 @@ GEM
|
|||
sprockets (4.2.1)
|
||||
concurrent-ruby (~> 1.0)
|
||||
rack (>= 2.2.4, < 4)
|
||||
sprockets-rails (3.5.1)
|
||||
sprockets-rails (3.5.2)
|
||||
actionpack (>= 6.1)
|
||||
activesupport (>= 6.1)
|
||||
sprockets (>= 3.0.0)
|
||||
|
@ -496,7 +497,7 @@ GEM
|
|||
sysexits (1.2.0)
|
||||
temple (0.10.3)
|
||||
thor (1.3.1)
|
||||
tilt (2.3.0)
|
||||
tilt (2.4.0)
|
||||
timeout (0.4.1)
|
||||
tldv (0.1.0)
|
||||
tldv-data (~> 1.0)
|
||||
|
@ -515,7 +516,7 @@ GEM
|
|||
unf_ext (0.0.8.2)
|
||||
unicode-display_width (2.5.0)
|
||||
uniform_notifier (1.16.0)
|
||||
view_component (3.12.1)
|
||||
view_component (3.13.0)
|
||||
activesupport (>= 5.2.0, < 8.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
method_source (~> 1.0)
|
||||
|
@ -530,7 +531,7 @@ GEM
|
|||
websocket-driver (0.7.6)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.5)
|
||||
zeitwerk (2.6.16)
|
||||
zeitwerk (2.6.17)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
@ -598,7 +599,7 @@ DEPENDENCIES
|
|||
rspec-mocks
|
||||
rspec-rails (~> 6.1)
|
||||
rspec-sidekiq (~> 5.0)
|
||||
rubocop (~> 1.64)
|
||||
rubocop (~> 1.65)
|
||||
rubocop-rails (~> 2.25)
|
||||
rubyzip (~> 2.3)
|
||||
sanitize
|
||||
|
|
|
@ -15,9 +15,9 @@ module Retrospring
|
|||
|
||||
def year = 2024
|
||||
|
||||
def month = 3
|
||||
def month = 8
|
||||
|
||||
def day = 19
|
||||
def day = 6
|
||||
|
||||
def patch = 0
|
||||
|
||||
|
|
|
@ -5,17 +5,76 @@ module UseCase
|
|||
class Answers < UseCase::DataExport::Base
|
||||
def files = {
|
||||
"answers.json" => json_file!(
|
||||
answers: user.answers.map(&method(:collect_answer))
|
||||
)
|
||||
answers: user.answers.map(&method(:collect_answer)),
|
||||
),
|
||||
}
|
||||
|
||||
def collect_answer(answer)
|
||||
{}.tap do |h|
|
||||
column_names(::Answer).each do |field|
|
||||
h[field] = answer[field]
|
||||
h[:related] = related_fields(answer)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def related_fields(answer) = {
|
||||
question: question_for(answer),
|
||||
comments: comments_for(answer),
|
||||
}
|
||||
|
||||
def question_for(answer)
|
||||
return unless answer.question
|
||||
|
||||
question = answer.question
|
||||
{}.tap do |q|
|
||||
q.merge!(
|
||||
id: nil,
|
||||
anonymous: false,
|
||||
generated: false,
|
||||
direct: false,
|
||||
author: nil,
|
||||
content: nil,
|
||||
created_at: nil,
|
||||
)
|
||||
|
||||
%i[id direct content created_at].each do |field|
|
||||
q[field] = question[field]
|
||||
end
|
||||
|
||||
if question.generated?
|
||||
q[:generated] = true
|
||||
q[:anonymous] = true
|
||||
elsif question.author_is_anonymous
|
||||
q[:anonymous] = true
|
||||
else
|
||||
q[:author] = lean_user(question.user)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def comments_for(answer) = [].tap do |c|
|
||||
next if answer.comments.empty?
|
||||
|
||||
answer.comments.order(:created_at).each do |comment|
|
||||
c << {
|
||||
id: comment.id,
|
||||
author: lean_user(comment.user),
|
||||
smile_count: comment.smile_count,
|
||||
content: comment.content,
|
||||
created_at: comment.created_at,
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def lean_user(user)
|
||||
return unless user
|
||||
|
||||
{
|
||||
id: user.id,
|
||||
screen_name: user.screen_name,
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,20 +3,24 @@
|
|||
module UseCase
|
||||
module DataExport
|
||||
class Theme < UseCase::DataExport::Base
|
||||
include ThemeHelper
|
||||
|
||||
MODEL_FIELDS = %i[id user_id created_at updated_at].freeze
|
||||
|
||||
def files
|
||||
return {} unless user.theme
|
||||
|
||||
{
|
||||
"theme.json" => json_file!(
|
||||
theme: theme_data
|
||||
)
|
||||
theme: theme_data,
|
||||
),
|
||||
}
|
||||
end
|
||||
|
||||
def theme_data
|
||||
{}.tap do |obj|
|
||||
column_names(::Theme).each do |field|
|
||||
obj[field] = user.theme[field]
|
||||
(column_names(::Theme) - MODEL_FIELDS).each do |field|
|
||||
obj[field] = "##{get_hex_color_from_theme_value(user.theme[field])}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -8,10 +8,10 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@fontsource/lexend": "^4.5.15",
|
||||
"@fortawesome/fontawesome-free": "^6.5.2",
|
||||
"@fortawesome/fontawesome-free": "^6.6.0",
|
||||
"@github/hotkey": "^3.1.1",
|
||||
"@hotwired/stimulus": "^3.2.2",
|
||||
"@hotwired/turbo-rails": "^8.0.4",
|
||||
"@hotwired/turbo-rails": "^8.0.5",
|
||||
"@melloware/coloris": "^0.24.0",
|
||||
"@popperjs/core": "^2.11",
|
||||
"@rails/request.js": "^0.0.9",
|
||||
|
@ -21,10 +21,10 @@
|
|||
"croppr": "^2.3.1",
|
||||
"i18n-js": "^4.0",
|
||||
"js-cookie": "2.2.1",
|
||||
"sass": "^1.77.6",
|
||||
"sass": "^1.77.8",
|
||||
"sweetalert": "1.1.3",
|
||||
"toastify-js": "^1.12.0",
|
||||
"typescript": "^5.5.2",
|
||||
"typescript": "^5.5.4",
|
||||
"yarn": "^1.22.22"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
|
@ -9,15 +9,15 @@ describe UseCase::DataExport::Answers, :data_export do
|
|||
it "returns an empty set of answers" do
|
||||
expect(json_file("answers.json")).to eq(
|
||||
{
|
||||
answers: []
|
||||
}
|
||||
answers: [],
|
||||
},
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
context "when user has made some answer" do
|
||||
let!(:answer) do
|
||||
travel_to(Time.utc(2022, 12, 10, 13, 37, 42)) { FactoryBot.create(:answer, user:, content: "Yay, data export!") }
|
||||
travel_to(Time.utc(2022, 12, 10, 13, 37, 42)) { FactoryBot.create(:answer, user:, content: "Yay, data export!", question: FactoryBot.build(:question, content: "awoo?")) }
|
||||
end
|
||||
|
||||
it "returns the answers as json" do
|
||||
|
@ -34,9 +34,280 @@ describe UseCase::DataExport::Answers, :data_export do
|
|||
updated_at: "2022-12-10T13:37:42.000Z",
|
||||
smile_count: 0,
|
||||
pinned_at: nil,
|
||||
related: {
|
||||
question: {
|
||||
id: answer.question.id,
|
||||
anonymous: true,
|
||||
generated: false,
|
||||
direct: true,
|
||||
author: nil,
|
||||
content: "awoo?",
|
||||
created_at: "2022-12-10T13:37:42.000Z",
|
||||
},
|
||||
comments: [],
|
||||
},
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
context "when user has made plenty of answers to many different question types" do
|
||||
let(:other_user) { FactoryBot.create(:user, screen_name: "TomTurbo") }
|
||||
|
||||
let!(:questions) do
|
||||
[
|
||||
travel_to(Time.utc(2024, 8, 6, 13, 12, 0)) { FactoryBot.create(:question, user: other_user, content: "Sieben Zwiebeln sieden Bienen auf Trieben", author_is_anonymous: false, direct: false) },
|
||||
travel_to(Time.utc(2024, 8, 6, 13, 37, 42)) { FactoryBot.create(:question, user:, content: "Direct question from myself, to myself!", author_is_anonymous: false, direct: true) },
|
||||
travel_to(Time.utc(2024, 8, 6, 13, 37, 42)) { FactoryBot.create(:question, user:, content: "The funny lasaganga in oven question", author_is_anonymous: true, direct: true, author_identifier: "justask") },
|
||||
travel_to(Time.utc(2024, 8, 6, 13, 37, 42)) { FactoryBot.create(:question, user:, content: "Export is ready", author_is_anonymous: true, direct: true, author_identifier: "retrospring_exporter") },
|
||||
travel_to(Time.utc(2024, 8, 6, 13, 37, 50)) { FactoryBot.create(:question, user:, content: "delete your account", author_is_anonymous: true, direct: true) }
|
||||
]
|
||||
end
|
||||
|
||||
let!(:answers) do
|
||||
questions.map.with_index do |question, i|
|
||||
travel_to(Time.utc(2024, 8, 6, 13, 37, i)) do
|
||||
FactoryBot.create(:answer, user:, content: "Yay, data export!", question:)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
let!(:answer_with_unknown_question) do
|
||||
travel_to(Time.utc(2024, 8, 6, 13, 38, 0)) do
|
||||
FactoryBot.create(:answer, user:, content: "aeeeugh???").tap { _1.update_column(:question_id, 666) } # rubocop:disable Rails/SkipsModelValidations
|
||||
end
|
||||
end
|
||||
|
||||
it "returns the answers as json" do
|
||||
expect(json_file("answers.json")).to eq(
|
||||
{
|
||||
answers: [
|
||||
{
|
||||
id: answers[0].id,
|
||||
content: "Yay, data export!",
|
||||
question_id: questions[0].id,
|
||||
comment_count: 0,
|
||||
user_id: user.id,
|
||||
created_at: "2024-08-06T13:37:00.000Z",
|
||||
updated_at: "2024-08-06T13:37:00.000Z",
|
||||
smile_count: 0,
|
||||
pinned_at: nil,
|
||||
related: {
|
||||
question: {
|
||||
id: questions[0].id,
|
||||
anonymous: false,
|
||||
generated: false,
|
||||
direct: false,
|
||||
author: {
|
||||
id: other_user.id,
|
||||
screen_name: "TomTurbo",
|
||||
},
|
||||
content: "Sieben Zwiebeln sieden Bienen auf Trieben",
|
||||
created_at: "2024-08-06T13:12:00.000Z",
|
||||
},
|
||||
comments: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
id: answers[1].id,
|
||||
content: "Yay, data export!",
|
||||
question_id: questions[1].id,
|
||||
comment_count: 0,
|
||||
user_id: user.id,
|
||||
created_at: "2024-08-06T13:37:01.000Z",
|
||||
updated_at: "2024-08-06T13:37:01.000Z",
|
||||
smile_count: 0,
|
||||
pinned_at: nil,
|
||||
related: {
|
||||
question: {
|
||||
id: questions[1].id,
|
||||
anonymous: false,
|
||||
generated: false,
|
||||
direct: true,
|
||||
author: {
|
||||
id: user.id,
|
||||
screen_name: user.screen_name,
|
||||
},
|
||||
content: "Direct question from myself, to myself!",
|
||||
created_at: "2024-08-06T13:37:42.000Z",
|
||||
},
|
||||
comments: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
id: answers[2].id,
|
||||
content: "Yay, data export!",
|
||||
question_id: questions[2].id,
|
||||
comment_count: 0,
|
||||
user_id: user.id,
|
||||
created_at: "2024-08-06T13:37:02.000Z",
|
||||
updated_at: "2024-08-06T13:37:02.000Z",
|
||||
smile_count: 0,
|
||||
pinned_at: nil,
|
||||
related: {
|
||||
question: {
|
||||
id: questions[2].id,
|
||||
anonymous: true,
|
||||
generated: true,
|
||||
direct: true,
|
||||
author: nil,
|
||||
content: "The funny lasaganga in oven question",
|
||||
created_at: "2024-08-06T13:37:42.000Z",
|
||||
},
|
||||
comments: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
id: answers[3].id,
|
||||
content: "Yay, data export!",
|
||||
question_id: questions[3].id,
|
||||
comment_count: 0,
|
||||
user_id: user.id,
|
||||
created_at: "2024-08-06T13:37:03.000Z",
|
||||
updated_at: "2024-08-06T13:37:03.000Z",
|
||||
smile_count: 0,
|
||||
pinned_at: nil,
|
||||
related: {
|
||||
question: {
|
||||
id: questions[3].id,
|
||||
anonymous: true,
|
||||
generated: true,
|
||||
direct: true,
|
||||
author: nil,
|
||||
content: "Export is ready",
|
||||
created_at: "2024-08-06T13:37:42.000Z",
|
||||
},
|
||||
comments: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
id: answers[4].id,
|
||||
content: "Yay, data export!",
|
||||
question_id: questions[4].id,
|
||||
comment_count: 0,
|
||||
user_id: user.id,
|
||||
created_at: "2024-08-06T13:37:04.000Z",
|
||||
updated_at: "2024-08-06T13:37:04.000Z",
|
||||
smile_count: 0,
|
||||
pinned_at: nil,
|
||||
related: {
|
||||
question: {
|
||||
id: questions[4].id,
|
||||
anonymous: true,
|
||||
generated: false,
|
||||
direct: true,
|
||||
author: nil,
|
||||
content: "delete your account",
|
||||
created_at: "2024-08-06T13:37:50.000Z",
|
||||
},
|
||||
comments: [],
|
||||
},
|
||||
},
|
||||
{
|
||||
id: answer_with_unknown_question.id,
|
||||
content: "aeeeugh???",
|
||||
question_id: 666,
|
||||
comment_count: 0,
|
||||
user_id: user.id,
|
||||
created_at: "2024-08-06T13:38:00.000Z",
|
||||
updated_at: "2024-08-06T13:38:00.000Z",
|
||||
smile_count: 0,
|
||||
pinned_at: nil,
|
||||
related: {
|
||||
question: nil,
|
||||
comments: [],
|
||||
},
|
||||
}
|
||||
],
|
||||
},
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
context "when user has made an answers that received comments" do
|
||||
let(:other_user) { FactoryBot.create(:user, screen_name: "TomTurbo") }
|
||||
|
||||
let!(:question) do
|
||||
travel_to(Time.utc(2024, 8, 6, 13, 12, 0)) { FactoryBot.create(:question, user: other_user, content: "Sieben Zwiebeln sieden Bienen auf Trieben", author_is_anonymous: false, direct: false) }
|
||||
end
|
||||
|
||||
let!(:answer) do
|
||||
travel_to(Time.utc(2024, 8, 6, 13, 38, 0)) { FactoryBot.create(:answer, user:, content: "Interessante Frage", question:) }
|
||||
end
|
||||
|
||||
let!(:comments) do
|
||||
[
|
||||
travel_to(Time.utc(2024, 8, 6, 13, 40, 0)) { FactoryBot.create(:comment, user:, answer:, content: "Kein Kommentar") },
|
||||
travel_to(Time.utc(2024, 8, 6, 13, 42, 0)) { FactoryBot.create(:comment, user:, answer:, content: "Sehr witzig") },
|
||||
travel_to(Time.utc(2024, 8, 6, 13, 41, 0)) { FactoryBot.create(:comment, user: other_user, answer:, content: "Jo eh.", smile_count: 1) }
|
||||
]
|
||||
end
|
||||
|
||||
it "returns the answers as json" do
|
||||
expect(json_file("answers.json")).to eq(
|
||||
{
|
||||
answers: [
|
||||
{
|
||||
id: answer.id,
|
||||
content: "Interessante Frage",
|
||||
question_id: answer.question.id,
|
||||
comment_count: 3,
|
||||
user_id: user.id,
|
||||
created_at: "2024-08-06T13:38:00.000Z",
|
||||
updated_at: "2024-08-06T13:38:00.000Z",
|
||||
smile_count: 0,
|
||||
pinned_at: nil,
|
||||
related: {
|
||||
question: {
|
||||
id: answer.question.id,
|
||||
anonymous: false,
|
||||
generated: false,
|
||||
direct: false,
|
||||
author: {
|
||||
id: other_user.id,
|
||||
screen_name: "TomTurbo",
|
||||
},
|
||||
content: "Sieben Zwiebeln sieden Bienen auf Trieben",
|
||||
created_at: "2024-08-06T13:12:00.000Z",
|
||||
},
|
||||
comments: [
|
||||
{
|
||||
id: comments[0].id,
|
||||
author: {
|
||||
id: user.id,
|
||||
screen_name: user.screen_name,
|
||||
},
|
||||
smile_count: 0,
|
||||
content: "Kein Kommentar",
|
||||
created_at: "2024-08-06T13:40:00.000Z",
|
||||
},
|
||||
{
|
||||
id: comments[2].id,
|
||||
author: {
|
||||
id: other_user.id,
|
||||
screen_name: other_user.screen_name,
|
||||
},
|
||||
smile_count: 1,
|
||||
content: "Jo eh.",
|
||||
created_at: "2024-08-06T13:41:00.000Z",
|
||||
},
|
||||
{
|
||||
id: comments[1].id,
|
||||
author: {
|
||||
id: user.id,
|
||||
screen_name: user.screen_name,
|
||||
},
|
||||
smile_count: 0,
|
||||
content: "Sehr witzig",
|
||||
created_at: "2024-08-06T13:42:00.000Z",
|
||||
}
|
||||
],
|
||||
},
|
||||
}
|
||||
],
|
||||
},
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
|
||||
require "rails_helper"
|
||||
|
||||
describe UseCase::DataExport::Theme, :data_export do
|
||||
describe UseCase::DataExport::Theme,
|
||||
:data_export do
|
||||
include ActiveSupport::Testing::TimeHelpers
|
||||
|
||||
context "when user doesn't have a theme" do
|
||||
|
@ -13,8 +14,14 @@ describe UseCase::DataExport::Theme, :data_export do
|
|||
|
||||
context "when user has a theme" do
|
||||
let!(:theme) do
|
||||
travel_to(Time.utc(2022, 12, 10, 13, 37, 42)) do
|
||||
FactoryBot.create(:theme, user:)
|
||||
travel_to(Time.utc(2022,
|
||||
12,
|
||||
10,
|
||||
13,
|
||||
37,
|
||||
42,)) do
|
||||
FactoryBot.create(:theme,
|
||||
user:,)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -22,36 +29,32 @@ describe UseCase::DataExport::Theme, :data_export do
|
|||
expect(json_file("theme.json")).to eq(
|
||||
{
|
||||
theme: {
|
||||
id: theme.id,
|
||||
user_id: user.id,
|
||||
primary_color: 9342168,
|
||||
primary_text: 16777215,
|
||||
danger_color: 14257035,
|
||||
danger_text: 16777215,
|
||||
success_color: 12573067,
|
||||
success_text: 16777215,
|
||||
warning_color: 14261899,
|
||||
warning_text: 16777215,
|
||||
info_color: 9165273,
|
||||
info_text: 16777215,
|
||||
dark_color: 6710886,
|
||||
dark_text: 15658734,
|
||||
raised_background: 16777215,
|
||||
raised_text: 3355443,
|
||||
background_color: 13026795,
|
||||
body_text: 3355443,
|
||||
muted_text: 3355443,
|
||||
created_at: "2022-12-10T13:37:42.000Z",
|
||||
updated_at: "2022-12-10T13:37:42.000Z",
|
||||
input_color: 15789556,
|
||||
input_text: 6710886,
|
||||
raised_accent: 16250871,
|
||||
raised_accent_text: 3355443,
|
||||
light_color: 16316922,
|
||||
light_text: 0,
|
||||
input_placeholder: 7107965
|
||||
}
|
||||
}
|
||||
background_color: "#c6c5eb",
|
||||
body_text: "#333333",
|
||||
danger_color: "#d98b8b",
|
||||
danger_text: "#ffffff",
|
||||
dark_color: "#666666",
|
||||
dark_text: "#eeeeee",
|
||||
info_color: "#8bd9d9",
|
||||
info_text: "#ffffff",
|
||||
input_color: "#f0edf4",
|
||||
input_placeholder: "#6c757d",
|
||||
input_text: "#666666",
|
||||
light_color: "#f8f9fa",
|
||||
light_text: "#000000",
|
||||
muted_text: "#333333",
|
||||
primary_color: "#8e8cd8",
|
||||
primary_text: "#ffffff",
|
||||
raised_accent: "#f7f7f7",
|
||||
raised_accent_text: "#333333",
|
||||
raised_background: "#ffffff",
|
||||
raised_text: "#333333",
|
||||
success_color: "#bfd98b",
|
||||
success_text: "#ffffff",
|
||||
warning_color: "#d99e8b",
|
||||
warning_text: "#ffffff",
|
||||
},
|
||||
},
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
42
yarn.lock
42
yarn.lock
|
@ -195,10 +195,10 @@
|
|||
resolved "https://registry.yarnpkg.com/@fontsource/lexend/-/lexend-4.5.15.tgz#ee033b850224d05b665d6661bf8d32c950f166bb"
|
||||
integrity sha512-6edLmDmte8pJWtQ1NIahcJq0iWlf6b0/JLwkd7WbDQ3C5tZWnxjvbP4RSklMv4MPzGjpuYuYnc+QANbjUws1oA==
|
||||
|
||||
"@fortawesome/fontawesome-free@^6.5.2":
|
||||
version "6.5.2"
|
||||
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.2.tgz#310fe90cb5a8dee9698833171b98e7835404293d"
|
||||
integrity sha512-hRILoInAx8GNT5IMkrtIt9blOdrqHOnPBH+k70aWUAqPZPgopb9G5EQJFpaBx/S8zp2fC+mPW349Bziuk1o28Q==
|
||||
"@fortawesome/fontawesome-free@^6.6.0":
|
||||
version "6.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.6.0.tgz#0e984f0f2344ee513c185d87d77defac4c0c8224"
|
||||
integrity sha512-60G28ke/sXdtS9KZCpZSHHkCbdsOGEhIUGlwq6yhY74UpTiToIh8np7A8yphhM4BWsvNFtIvLpi4co+h9Mr9Ow==
|
||||
|
||||
"@github/hotkey@^3.1.1":
|
||||
version "3.1.1"
|
||||
|
@ -210,18 +210,18 @@
|
|||
resolved "https://registry.yarnpkg.com/@hotwired/stimulus/-/stimulus-3.2.2.tgz#071aab59c600fed95b97939e605ff261a4251608"
|
||||
integrity sha512-eGeIqNOQpXoPAIP7tC1+1Yc1yl1xnwYqg+3mzqxyrbE5pg5YFBZcA6YoTiByJB6DKAEsiWtl6tjTJS4IYtbB7A==
|
||||
|
||||
"@hotwired/turbo-rails@^8.0.4":
|
||||
version "8.0.4"
|
||||
resolved "https://registry.yarnpkg.com/@hotwired/turbo-rails/-/turbo-rails-8.0.4.tgz#d224f524a9e33fe687cec5d706054eb6fe13fa5b"
|
||||
integrity sha512-GHCv5+B2VzYZZvMFpg/g9JLx/8pl/8chcubSB7T+Xn1zYOMqAKB6cT80vvWUzxdwfm/2KfaRysfDz+BmvtjFaw==
|
||||
"@hotwired/turbo-rails@^8.0.5":
|
||||
version "8.0.5"
|
||||
resolved "https://registry.yarnpkg.com/@hotwired/turbo-rails/-/turbo-rails-8.0.5.tgz#18c2f0e4f7f952307650308590edf5eb9544b0d3"
|
||||
integrity sha512-1A9G9u28IRAl0C57z8Ka3AhNPyJdwfOrbjr+ABZk2ZEUw2QO7cJ0pgs77asUj2E/tzn1PgrxrSVu24W+1Q5uBA==
|
||||
dependencies:
|
||||
"@hotwired/turbo" "^8.0.4"
|
||||
"@hotwired/turbo" "^8.0.5"
|
||||
"@rails/actioncable" "^7.0"
|
||||
|
||||
"@hotwired/turbo@^8.0.4":
|
||||
version "8.0.4"
|
||||
resolved "https://registry.yarnpkg.com/@hotwired/turbo/-/turbo-8.0.4.tgz#5c5361c06a37cdf10dcba4223f1afd0ca1c75091"
|
||||
integrity sha512-mlZEFUZrJnpfj+g/XeCWWuokvQyN68WvM78JM+0jfSFc98wegm259vCbC1zSllcspRwbgXK31ibehCy5PA78/Q==
|
||||
"@hotwired/turbo@^8.0.5":
|
||||
version "8.0.5"
|
||||
resolved "https://registry.yarnpkg.com/@hotwired/turbo/-/turbo-8.0.5.tgz#abae6dad018a891e4286e87fa0959217e3866d5a"
|
||||
integrity sha512-TdZDA7fxVQ2ZycygvpnzjGPmFq4sO/E2QVg+2em/sJ3YTSsIWVEis8HmWlumz+c9DjWcUkcCuB+muF08TInpAQ==
|
||||
|
||||
"@humanwhocodes/config-array@^0.11.14":
|
||||
version "0.11.14"
|
||||
|
@ -2262,10 +2262,10 @@ safe-regex-test@^1.0.0:
|
|||
get-intrinsic "^1.1.3"
|
||||
is-regex "^1.1.4"
|
||||
|
||||
sass@^1.77.6:
|
||||
version "1.77.6"
|
||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.6.tgz#898845c1348078c2e6d1b64f9ee06b3f8bd489e4"
|
||||
integrity sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==
|
||||
sass@^1.77.8:
|
||||
version "1.77.8"
|
||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.8.tgz#9f18b449ea401759ef7ec1752a16373e296b52bd"
|
||||
integrity sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==
|
||||
dependencies:
|
||||
chokidar ">=3.0.0 <4.0.0"
|
||||
immutable "^4.0.0"
|
||||
|
@ -2665,10 +2665,10 @@ typed-array-length@^1.0.4:
|
|||
for-each "^0.3.3"
|
||||
is-typed-array "^1.1.9"
|
||||
|
||||
typescript@^5.5.2:
|
||||
version "5.5.2"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.2.tgz#c26f023cb0054e657ce04f72583ea2d85f8d0507"
|
||||
integrity sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==
|
||||
typescript@^5.5.4:
|
||||
version "5.5.4"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba"
|
||||
integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==
|
||||
|
||||
unbox-primitive@^1.0.2:
|
||||
version "1.0.2"
|
||||
|
|
Loading…
Reference in New Issue