From b65977a93e03db0f1487809b262f4236779450d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 28 Feb 2026 09:17:52 +0000 Subject: [PATCH 1/3] Bump the rubocop group with 2 updates Bumps the rubocop group with 2 updates: [rubocop](https://github.com/rubocop/rubocop) and [rubocop-minitest](https://github.com/rubocop/rubocop-minitest). Updates `rubocop` from 1.84.2 to 1.85.0 - [Release notes](https://github.com/rubocop/rubocop/releases) - [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop/rubocop/compare/v1.84.2...v1.85.0) Updates `rubocop-minitest` from 0.38.2 to 0.39.1 - [Release notes](https://github.com/rubocop/rubocop-minitest/releases) - [Changelog](https://github.com/rubocop/rubocop-minitest/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop/rubocop-minitest/compare/v0.38.2...v0.39.1) --- updated-dependencies: - dependency-name: rubocop dependency-version: 1.85.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: rubocop - dependency-name: rubocop-minitest dependency-version: 0.39.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: rubocop ... Signed-off-by: dependabot[bot] --- Gemfile | 4 ++-- Gemfile.lock | 29 +++++++++++++++++++++-------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/Gemfile b/Gemfile index bb66725f..e74a75e0 100644 --- a/Gemfile +++ b/Gemfile @@ -47,9 +47,9 @@ end group :development do gem 'annotaterb', '~> 4.22', require: false - gem 'rubocop', '~> 1.84', require: false + gem 'rubocop', '~> 1.85', require: false gem 'rubocop-factory_bot', '~> 2.28', require: false - gem 'rubocop-minitest', '~> 0.38.2', require: false + gem 'rubocop-minitest', '~> 0.39.1', require: false gem 'rubocop-rails', '~> 2.34', require: false gem 'ruby-lsp', '~> 0.26.7', require: false diff --git a/Gemfile.lock b/Gemfile.lock index c95d538c..a274808b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -75,6 +75,8 @@ GEM securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) uri (>= 0.13.1) + addressable (2.8.9) + public_suffix (>= 2.0.2, < 8.0) annotaterb (4.22.0) activerecord (>= 6.0.0) activesupport (>= 6.0.0) @@ -136,6 +138,9 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.18.1) + json-schema (6.1.0) + addressable (~> 2.8) + bigdecimal (>= 3.1, < 5) language_server-protocol (3.17.0.5) lint_roller (1.1.0) logger (1.7.0) @@ -149,6 +154,8 @@ GEM net-pop net-smtp marcel (1.1.0) + mcp (0.7.1) + json-schema (>= 4.1) mini_magick (5.1.2) benchmark logger @@ -173,7 +180,7 @@ GEM mini_portile2 (~> 2.8.2) racc (~> 1.4) parallel (1.27.0) - parser (3.3.10.1) + parser (3.3.10.2) ast (~> 2.4.1) racc pg (1.6.3) @@ -184,6 +191,7 @@ GEM psych (5.3.1) date stringio + public_suffix (7.0.2) puma (7.2.0) nio4r (~> 2.0) pundit (2.5.2) @@ -244,10 +252,11 @@ GEM reline (0.6.3) io-console (~> 0.5) rexml (3.4.2) - rubocop (1.84.2) + rubocop (1.85.0) json (~> 2.3) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.1.0) + mcp (~> 0.6) parallel (~> 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) @@ -261,7 +270,7 @@ GEM rubocop-factory_bot (2.28.0) lint_roller (~> 1.1) rubocop (~> 1.72, >= 1.72.1) - rubocop-minitest (0.38.2) + rubocop-minitest (0.39.1) lint_roller (~> 1.1) rubocop (>= 1.75.0, < 2.0) rubocop-ast (>= 1.38.0, < 2.0) @@ -329,9 +338,9 @@ DEPENDENCIES pundit (~> 2.5) rack-cors (~> 3.0) rails (~> 8.1) - rubocop (~> 1.84) + rubocop (~> 1.85) rubocop-factory_bot (~> 2.28) - rubocop-minitest (~> 0.38.2) + rubocop-minitest (~> 0.39.1) rubocop-rails (~> 2.34) ruby-lsp (~> 0.26.7) simplecov (~> 0.22) @@ -353,6 +362,7 @@ CHECKSUMS activerecord (8.1.2) sha256=acfbe0cadfcc50fa208011fe6f4eb01cae682ebae0ef57145ba45380c74bcc44 activestorage (8.1.2) sha256=8a63a48c3999caeee26a59441f813f94681fc35cc41aba7ce1f836add04fba76 activesupport (8.1.2) sha256=88842578ccd0d40f658289b0e8c842acfe9af751afee2e0744a7873f50b6fdae + addressable (2.8.9) sha256=cc154fcbe689711808a43601dee7b980238ce54368d23e127421753e46895485 annotaterb (4.22.0) sha256=66fc40e5f48d5b82ae82013da1e5b43aaaad41ee9bd3d0cf803048efc0a70286 ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b @@ -385,12 +395,14 @@ CHECKSUMS io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc irb (1.17.0) sha256=168c4ddb93d8a361a045c41d92b2952c7a118fa73f23fe14e55609eb7a863aae json (2.18.1) sha256=fe112755501b8d0466b5ada6cf50c8c3f41e897fa128ac5d263ec09eedc9f986 + json-schema (6.1.0) sha256=6bf70a2cfb6dfd5a06da28093fa8190f324c88eabd36a7f47097f227321dc702 language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 loofah (2.25.0) sha256=df5ed7ac3bac6a4ec802df3877ee5cc86d027299f8952e6243b3dac446b060e6 mail (2.9.0) sha256=6fa6673ecd71c60c2d996260f9ee3dd387d4673b8169b502134659ece6d34941 marcel (1.1.0) sha256=fdcfcfa33cc52e93c4308d40e4090a5d4ea279e160a7f6af988260fa970e0bee + mcp (0.7.1) sha256=fa967895d6952bad0d981ea907731d8528d2c246d2079d56a9c8bae83d14f1c7 mini_magick (5.1.2) sha256=2c57112a2c55d9f86b1ed7ab568b3c389a3265788ac5c1ad3e632a201b629a7e mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef mini_portile2 (2.8.9) sha256=0cd7c7f824e010c072e33f68bc02d85a00aeb6fce05bb4819c03dfd3c140c289 @@ -404,12 +416,13 @@ CHECKSUMS nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1 nokogiri (1.19.1) sha256=598b327f36df0b172abd57b68b18979a6e14219353bca87180c31a51a00d5ad3 parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130 - parser (3.3.10.1) sha256=06f6a725d2cd91e5e7f2b7c32ba143631e1f7c8ae2fb918fc4cebec187e6a688 + parser (3.3.10.2) sha256=6f60c84aa4bdcedb6d1a2434b738fe8a8136807b6adc8f7f53b97da9bc4e9357 pg (1.6.3) sha256=1388d0563e13d2758c1089e35e973a3249e955c659592d10e5b77c468f628a99 pp (0.6.3) sha256=2951d514450b93ccfeb1df7d021cae0da16e0a7f95ee1e2273719669d0ab9df6 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 psych (5.3.1) sha256=eb7a57cef10c9d70173ff74e739d843ac3b2c019a003de48447b2963d81b1974 + public_suffix (7.0.2) sha256=9114090c8e4e7135c1fd0e7acfea33afaab38101884320c65aaa0ffb8e26a857 puma (7.2.0) sha256=bf8ef4ab514a4e6d4554cb4326b2004eba5036ae05cf765cfe51aba9706a72a8 pundit (2.5.2) sha256=e374152baa24f90b630428293faf4b4c5468fc3cc010165f7d8fcb44ce108bbd raabro (1.4.0) sha256=d4fa9ff5172391edb92b242eed8be802d1934b1464061ae5e70d80962c5da882 @@ -430,10 +443,10 @@ CHECKSUMS regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4 reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835 rexml (3.4.2) sha256=1384268554a37af5da5279431ca3f2f37d46f09ffdd6c95e17cc84c83ea7c417 - rubocop (1.84.2) sha256=5692cea54168f3dc8cb79a6fe95c5424b7ea893c707ad7a4307b0585e88dbf5f + rubocop (1.85.0) sha256=317407feb681a07d54f64d2f9e1d6b6af1ce7678e51cd658e3ad8bd66da48c01 rubocop-ast (1.49.0) sha256=49c3676d3123a0923d333e20c6c2dbaaae2d2287b475273fddee0c61da9f71fd rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb - rubocop-minitest (0.38.2) sha256=5a9dfb5a538973d0601aa51e59637d3998bb8df81233edf1ff421504c6280068 + rubocop-minitest (0.39.1) sha256=998398d6da4026d297f0f9bf709a1eac5f2b6947c24431f94af08138510cf7ed rubocop-rails (2.34.3) sha256=10d37989024865ecda8199f311f3faca990143fbac967de943f88aca11eb9ad2 ruby-lsp (0.26.7) sha256=60a1199fc7e329348d63a2479854f94435725d833eeabf3d539b790185cbf21f ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 From e754aa187a148001c0d1d2b1ad0f9bc7f69070f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 28 Feb 2026 09:18:20 +0000 Subject: [PATCH 2/3] Update gemset.nix --- gemset.nix | 65 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 7 deletions(-) diff --git a/gemset.nix b/gemset.nix index f30ba84f..34fb2cc6 100644 --- a/gemset.nix +++ b/gemset.nix @@ -155,6 +155,19 @@ targets = []; version = "8.1.2"; }; + addressable = { + dependencies = ["public_suffix"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "11ali533wx91fh93xlk88gjqq8w0p7kxw09nlh41hwc9wv5ly5fc"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "2.8.9"; + }; annotaterb = { dependencies = ["activerecord" "activesupport"]; groups = ["development"]; @@ -554,6 +567,19 @@ targets = []; version = "2.18.1"; }; + json-schema = { + dependencies = ["addressable" "bigdecimal"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00n73lr2gwlpf3safdmxxa44qchg36l3y298v835mzbdzcn0mxvb"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "6.1.0"; + }; language_server-protocol = { groups = ["default" "development"]; platforms = []; @@ -628,6 +654,19 @@ targets = []; version = "1.1.0"; }; + mcp = { + dependencies = ["json-schema"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1izi2hyyifn8m5b9s1yj8v1d4a453mrhga8yk06ssawmssapi5ps"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "0.7.1"; + }; mini_magick = { dependencies = ["benchmark" "logger"]; groups = ["default"]; @@ -798,12 +837,12 @@ platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1256ws3w3gnfqj7r3yz2i9y1y7k38fhjphxpybkyb4fds8jsgxh6"; + sha256 = "0mwk9syajzdradzqzp3agf03d0cazqwbfd1439nxpkmxli5chq3g"; target = "ruby"; type = "gem"; }; targets = []; - version = "3.3.10.1"; + version = "3.3.10.2"; }; pg = { groups = ["default"]; @@ -867,6 +906,18 @@ targets = []; version = "5.3.1"; }; + public_suffix = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0mx84s7gn3xabb320hw8060v7amg6gmcyyhfzp0kawafiq60j54i"; + target = "ruby"; + type = "gem"; + }; + targets = []; + version = "7.0.2"; + }; puma = { dependencies = ["nio4r"]; groups = ["default"]; @@ -1121,17 +1172,17 @@ version = "3.4.2"; }; rubocop = { - dependencies = ["json" "language_server-protocol" "lint_roller" "parallel" "parser" "rainbow" "regexp_parser" "rubocop-ast" "ruby-progressbar" "unicode-display_width"]; + dependencies = ["json" "language_server-protocol" "lint_roller" "mcp" "parallel" "parser" "rainbow" "regexp_parser" "rubocop-ast" "ruby-progressbar" "unicode-display_width"]; groups = ["development"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0pxzipl8a1bv62jdfykh7j4ymdr4aiffjvwsny6drwv886jwx4jn"; + sha256 = "00cclinxd2xdwdcdc775g1vcxwbadcfrwbsdyra7v841nvz0fx1i"; target = "ruby"; type = "gem"; }; targets = []; - version = "1.84.2"; + version = "1.85.0"; }; rubocop-ast = { dependencies = ["parser" "prism"]; @@ -1165,12 +1216,12 @@ platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0s00533085a2zzqyscqjz26vp61rgmimj7m539hd0ww9addgp7as"; + sha256 = "1vgp1i8ki0gh9bwk2i628xljnpxc3sd71gzry2bx49j0vbb9i0wr"; target = "ruby"; type = "gem"; }; targets = []; - version = "0.38.2"; + version = "0.39.1"; }; rubocop-rails = { dependencies = ["activesupport" "lint_roller" "rack" "rubocop" "rubocop-ast"]; From ed03613a061bb96549eec3033c1546640a727be9 Mon Sep 17 00:00:00 2001 From: Charlotte Van Petegem Date: Sat, 28 Feb 2026 10:31:27 +0100 Subject: [PATCH 3/3] Fix linting errors --- app/models/rescan_runner.rb | 5 + test/controllers/tracks_controller_test.rb | 182 ++++++++++----------- test/test_helper.rb | 4 + 3 files changed, 100 insertions(+), 91 deletions(-) diff --git a/app/models/rescan_runner.rb b/app/models/rescan_runner.rb index 50eef8cb..ab2f2b3d 100644 --- a/app/models/rescan_runner.rb +++ b/app/models/rescan_runner.rb @@ -176,10 +176,15 @@ def find_image(path) cover_info = find_cover path return if cover_info.blank? + # rubocop:disable Style/FileOpen + # The File.open here is the Rails recommended way to attach a file to an + # activestorage attribute. We can assume that Rails properly closes the IO + # stream after use. Image.new(image_type: cover_info[0], image: { io: File.open(cover_info[1]), filename: File.basename(cover_info[1]), content_type: cover_info[0].mimetype }) + # rubocop:enable Style/FileOpen end def find_cover(path) diff --git a/test/controllers/tracks_controller_test.rb b/test/controllers/tracks_controller_test.rb index f2932c7b..aea0e41e 100644 --- a/test/controllers/tracks_controller_test.rb +++ b/test/controllers/tracks_controller_test.rb @@ -287,120 +287,120 @@ class TracksControllerTest < ActionDispatch::IntegrationTest assert_response :success end -end -class TracksControllerAudioTest < ActionDispatch::IntegrationTest - setup do - sign_in_as(create(:user)) - install_audio_file_convert_stub - end + class TracksControllerAudioTest < ActionDispatch::IntegrationTest + setup do + sign_in_as(create(:user)) + install_audio_file_convert_stub + end - teardown do - uninstall_audio_file_convert_stub - end + teardown do + uninstall_audio_file_convert_stub + end - test 'should return not_found if codec_conversion does not exit ' do - location = Location.create(path: Rails.root.join('test/files')) - audio_file = create(:audio_file, location:, filename: '/base.flac') - track = create(:track, audio_file:) + test 'should return not_found if codec_conversion does not exit ' do + location = Location.create(path: Rails.root.join('test/files')) + audio_file = create(:audio_file, location:, filename: '/base.flac') + track = create(:track, audio_file:) - get audio_track_url(track, codec_conversion_id: 0) + get audio_track_url(track, codec_conversion_id: 0) - assert_response :not_found - end - - test 'should create transcoded_item if codec_conversion is present' do - mp3 = Codec.create(mimetype: 'audio/mpeg', extension: 'mp3') - codec_conversion = CodecConversion.create(name: 'MP3 (V0)', ffmpeg_params: '-acodec mp3 -q:a 0', resulting_codec: mp3) - location = Location.create(path: Rails.root.join('test/files')) - flac = Codec.create(mimetype: 'audio/flac', extension: 'flac') - audio_file = create(:audio_file, location:, filename: '/base.flac', codec: flac) - perform_enqueued_jobs - TranscodedItem.destroy_all - track = create(:track, audio_file:) - - assert_difference('TranscodedItem.count', 1) do - get audio_track_url(track, codec_conversion_id: codec_conversion.id) + assert_response :not_found end - transcoded_item = TranscodedItem.find_by(audio_file:, codec_conversion:) - - assert_equal File.open(transcoded_item.path).size.to_s, response.headers['content-length'] - assert_match 'audio/mpeg', response.headers['content-type'] + test 'should create transcoded_item if codec_conversion is present' do + mp3 = Codec.create(mimetype: 'audio/mpeg', extension: 'mp3') + codec_conversion = CodecConversion.create(name: 'MP3 (V0)', ffmpeg_params: '-acodec mp3 -q:a 0', resulting_codec: mp3) + location = Location.create(path: Rails.root.join('test/files')) + flac = Codec.create(mimetype: 'audio/flac', extension: 'flac') + audio_file = create(:audio_file, location:, filename: '/base.flac', codec: flac) + perform_enqueued_jobs + TranscodedItem.destroy_all + track = create(:track, audio_file:) + + assert_difference('TranscodedItem.count', 1) do + get audio_track_url(track, codec_conversion_id: codec_conversion.id) + end - assert_response :success - end + transcoded_item = TranscodedItem.find_by(audio_file:, codec_conversion:) - test 'should create transcoded_item if it already exists but file is gone' do - codec_conversion = create(:codec_conversion) - location = Location.create(path: Rails.root.join('test/files')) - flac = Codec.create(mimetype: 'audio/flac', extension: 'flac') - audio_file = create(:audio_file, location:, filename: '/base.flac', codec: flac) - track = create(:track, audio_file:) - perform_enqueued_jobs - transcode = TranscodedItem.find_by(audio_file:, codec_conversion:) - File.delete(transcode.path) + assert_equal File.open(transcoded_item.path, &:size).then(&:to_s), response.headers['content-length'] + assert_match 'audio/mpeg', response.headers['content-type'] - assert_difference('TranscodedItem.count', 0) do - get audio_track_url(track, codec_conversion_id: codec_conversion.id) + assert_response :success end - assert_nil TranscodedItem.find_by(id: transcode.id) - assert_response :success - end + test 'should create transcoded_item if it already exists but file is gone' do + codec_conversion = create(:codec_conversion) + location = Location.create(path: Rails.root.join('test/files')) + flac = Codec.create(mimetype: 'audio/flac', extension: 'flac') + audio_file = create(:audio_file, location:, filename: '/base.flac', codec: flac) + track = create(:track, audio_file:) + perform_enqueued_jobs + transcode = TranscodedItem.find_by(audio_file:, codec_conversion:) + File.delete(transcode.path) + + assert_difference('TranscodedItem.count', 0) do + get audio_track_url(track, codec_conversion_id: codec_conversion.id) + end + assert_nil TranscodedItem.find_by(id: transcode.id) - test 'should not create transcoded_item if it already exists' do - codec_conversion = create(:codec_conversion) - location = Location.create(path: Rails.root.join('test/files')) - flac = Codec.create(mimetype: 'audio/flac', extension: 'flac') - audio_file = create(:audio_file, location:, filename: '/base.flac', codec: flac) - track = create(:track, audio_file:) - get audio_track_url(track, codec_conversion_id: codec_conversion.id) + assert_response :success + end - assert_difference('TranscodedItem.count', 0) do + test 'should not create transcoded_item if it already exists' do + codec_conversion = create(:codec_conversion) + location = Location.create(path: Rails.root.join('test/files')) + flac = Codec.create(mimetype: 'audio/flac', extension: 'flac') + audio_file = create(:audio_file, location:, filename: '/base.flac', codec: flac) + track = create(:track, audio_file:) get audio_track_url(track, codec_conversion_id: codec_conversion.id) - end - assert_response :success - end + assert_difference('TranscodedItem.count', 0) do + get audio_track_url(track, codec_conversion_id: codec_conversion.id) + end - test 'should return correct headers for range request' do - mp3 = Codec.create(mimetype: 'audio/mpeg', extension: 'mp3') - codec_conversion = CodecConversion.create(name: 'MP3 (V0)', ffmpeg_params: '-acodec mp3 -q:a 0', resulting_codec: mp3) - location = Location.create(path: Rails.root.join('test/files')) - flac = Codec.create(mimetype: 'audio/flac', extension: 'flac') - audio_file = create(:audio_file, location:, filename: '/base.flac', codec: flac) - perform_enqueued_jobs - transcoded_item = TranscodedItem.find_by(audio_file:, codec_conversion:) - length = File.open(transcoded_item.path).size - track = create(:track, audio_file:) + assert_response :success + end - get(audio_track_url(track, codec_conversion_id: codec_conversion.id), headers: { range: 'bytes=150-500' }) + test 'should return correct headers for range request' do + mp3 = Codec.create(mimetype: 'audio/mpeg', extension: 'mp3') + codec_conversion = CodecConversion.create(name: 'MP3 (V0)', ffmpeg_params: '-acodec mp3 -q:a 0', resulting_codec: mp3) + location = Location.create(path: Rails.root.join('test/files')) + flac = Codec.create(mimetype: 'audio/flac', extension: 'flac') + audio_file = create(:audio_file, location:, filename: '/base.flac', codec: flac) + perform_enqueued_jobs + transcoded_item = TranscodedItem.find_by(audio_file:, codec_conversion:) + length = File.open(transcoded_item.path, &:size) + track = create(:track, audio_file:) - assert_equal "bytes 150-500/#{length}", response.headers['content-range'] - assert_equal '351', response.headers['content-length'] - assert_match 'audio/mpeg', response.headers['content-type'] + get(audio_track_url(track, codec_conversion_id: codec_conversion.id), headers: { range: 'bytes=150-500' }) - assert_response :success - end + assert_equal "bytes 150-500/#{length}", response.headers['content-range'] + assert_equal '351', response.headers['content-length'] + assert_match 'audio/mpeg', response.headers['content-type'] - test 'accepts range request without end' do - mp3 = Codec.create(mimetype: 'audio/mpeg', extension: 'mp3') - codec_conversion = CodecConversion.create(name: 'MP3 (V0)', ffmpeg_params: '-acodec mp3 -q:a 0', resulting_codec: mp3) - location = Location.create(path: Rails.root.join('test/files')) - flac = Codec.create(mimetype: 'audio/flac', extension: 'flac') - audio_file = create(:audio_file, location:, filename: '/base.flac', codec: flac) - perform_enqueued_jobs - transcoded_item = TranscodedItem.find_by(audio_file:, codec_conversion:) - length = File.open(transcoded_item.path).size - track = create(:track, audio_file:) + assert_response :success + end - get(audio_track_url(track, codec_conversion_id: codec_conversion.id), headers: { range: 'bytes=150-' }) + test 'accepts range request without end' do + mp3 = Codec.create(mimetype: 'audio/mpeg', extension: 'mp3') + codec_conversion = CodecConversion.create(name: 'MP3 (V0)', ffmpeg_params: '-acodec mp3 -q:a 0', resulting_codec: mp3) + location = Location.create(path: Rails.root.join('test/files')) + flac = Codec.create(mimetype: 'audio/flac', extension: 'flac') + audio_file = create(:audio_file, location:, filename: '/base.flac', codec: flac) + perform_enqueued_jobs + transcoded_item = TranscodedItem.find_by(audio_file:, codec_conversion:) + length = File.open(transcoded_item.path, &:size) + track = create(:track, audio_file:) - assert_equal "bytes 150-#{length - 1}/#{length}", response.headers['content-range'] - assert_equal (length - 150).to_s, response.headers['content-length'] - assert_match 'audio/mpeg', response.headers['content-type'] + get(audio_track_url(track, codec_conversion_id: codec_conversion.id), headers: { range: 'bytes=150-' }) - assert_response :success + assert_equal "bytes 150-#{length - 1}/#{length}", response.headers['content-range'] + assert_equal (length - 150).to_s, response.headers['content-length'] + assert_match 'audio/mpeg', response.headers['content-type'] + + assert_response :success + end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 88a3173c..46414119 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -15,6 +15,9 @@ require 'rails/test_help' require 'mocha/minitest' +# rubocop:disable Style/OneClassPerFile +# All modules and classes defined here are monkeypatches for standard rails test +# behaviour, and are a very normal way to do this. module AudioFileTestHelper def install_audio_file_convert_stub(implementation = nil) AudioFile.alias_method :old_convert, :convert @@ -113,3 +116,4 @@ class ActionDispatch::IntegrationTest include EtagHelper include SignInHelper end +# rubocop:enable Style/OneClassPerFile