diff --git a/.rubocop.yml b/.rubocop.yml index d10a878..c1f736e 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,4 +1,8 @@ -require: rubocop-performance +plugins: + - rubocop-minitest + - rubocop-performance + - rubocop-rake + - rubocop-thread_safety AllCops: TargetRubyVersion: '3.2' @@ -34,3 +38,7 @@ Style/TrailingCommaInHashLiteral: Gemspec/DevelopmentDependencies: Enabled: false + +# Sometimes it makes sense to have lots of assertions. +Minitest/MultipleAssertions: + Enabled: false diff --git a/Rakefile b/Rakefile index 86de0d2..355dfd0 100644 --- a/Rakefile +++ b/Rakefile @@ -11,5 +11,4 @@ end RuboCop::RakeTask.new desc 'Run tests and RuboCop' -task default: :test -task default: :rubocop +task default: %i[test rubocop] diff --git a/maxmind-db.gemspec b/maxmind-db.gemspec index 2b39d4f..d559aa1 100644 --- a/maxmind-db.gemspec +++ b/maxmind-db.gemspec @@ -24,5 +24,8 @@ Gem::Specification.new do |s| s.add_development_dependency 'minitest' s.add_development_dependency 'rake' s.add_development_dependency 'rubocop' + s.add_development_dependency 'rubocop-minitest' s.add_development_dependency 'rubocop-performance' + s.add_development_dependency 'rubocop-rake' + s.add_development_dependency 'rubocop-thread_safety' end diff --git a/test/test_decoder.rb b/test/test_decoder.rb index 5a40c3d..72de891 100644 --- a/test/test_decoder.rb +++ b/test/test_decoder.rb @@ -158,6 +158,7 @@ def test_pointer def test_string values = validate_type_decoding('string', @@strings) + values.each do |s| assert_equal(Encoding::UTF_8, s.encoding) end diff --git a/test/test_reader.rb b/test/test_reader.rb index 15c80f5..1f6461a 100644 --- a/test/test_reader.rb +++ b/test/test_reader.rb @@ -39,6 +39,7 @@ def test_reader_inspect modes.each do |mode| filename = 'test/data/test-data/MaxMind-DB-test-ipv4-24.mmdb' reader = MaxMind::DB.new(filename, mode: mode) + assert_instance_of(String, reader.inspect) end end @@ -157,10 +158,11 @@ def test_decoder 'test/data/test-data/MaxMind-DB-test-decoder.mmdb' ) record = reader.get('::1.1.1.0') + assert_equal([1, 2, 3], record['array']) - assert_equal(true, record['boolean']) + assert(record['boolean']) assert_equal("\x00\x00\x00*".b, record['bytes']) - assert_equal(42.123456, record['double']) + assert_in_delta(42.123456, record['double']) assert_in_delta(1.1, record['float']) assert_equal(-268_435_456, record['int32']) assert_equal( @@ -184,6 +186,7 @@ def test_metadata_pointers reader = MaxMind::DB.new( 'test/data/test-data/MaxMind-DB-test-metadata-pointers.mmdb' ) + assert_equal('Lots of pointers in metadata', reader.metadata.database_type) reader.close end @@ -192,6 +195,7 @@ def test_no_ipv4_search_tree reader = MaxMind::DB.new( 'test/data/test-data/MaxMind-DB-no-ipv4-search-tree.mmdb' ) + assert_equal('::0/64', reader.get('1.1.1.1')) assert_equal('::0/64', reader.get('192.1.1.1')) reader.close @@ -244,7 +248,7 @@ def test_ip_validation e = assert_raises ArgumentError do reader.get('not_ip') end - assert(e.message.include?('invalid address')) + assert_includes(e.message, 'invalid address') reader.close end @@ -252,7 +256,7 @@ def test_missing_database e = assert_raises SystemCallError do MaxMind::DB.new('file-does-not-exist.mmdb') end - assert(e.message.include?('No such file or directory')) + assert_includes(e.message, 'No such file or directory') end def test_nondatabase @@ -269,14 +273,14 @@ def test_too_many_constructor_args e = assert_raises ArgumentError do MaxMind::DB.new('README.md', {}, 'blah') end - assert(e.message.include?('wrong number of arguments')) + assert_includes(e.message, 'wrong number of arguments') end def test_no_constructor_args e = assert_raises ArgumentError do MaxMind::DB.new end - assert(e.message.include?('wrong number of arguments')) + assert_includes(e.message, 'wrong number of arguments') end def test_too_many_get_args @@ -286,7 +290,7 @@ def test_too_many_get_args e = assert_raises ArgumentError do reader.get('1.1.1.1', 'blah') end - assert(e.message.include?('wrong number of arguments')) + assert_includes(e.message, 'wrong number of arguments') reader.close end @@ -297,7 +301,7 @@ def test_no_get_args e = assert_raises ArgumentError do reader.get end - assert(e.message.include?('wrong number of arguments')) + assert_includes(e.message, 'wrong number of arguments') reader.close end @@ -308,7 +312,7 @@ def test_metadata_args e = assert_raises ArgumentError do reader.metadata('hi') end - assert(e.message.include?('wrong number of arguments')) + assert_includes(e.message, 'wrong number of arguments') reader.close end @@ -353,6 +357,7 @@ def test_closed_metadata 'test/data/test-data/MaxMind-DB-test-decoder.mmdb' ) reader.close + assert_equal( { 'en' => 'MaxMind DB Decoder Test database - contains every MaxMind DB data type' }, reader.metadata.description, @@ -373,7 +378,9 @@ def test_threads threads = [] num_threads.times do |i| + # rubocop:disable ThreadSafety/NewThread threads << Thread.new do + # rubocop:enable ThreadSafety/NewThread num_lookups.times do |j| thread_lookups[i] << reader.get("65.115.240.#{j}") thread_lookups[i] << reader.get("2a02:2770:3::#{j}") @@ -474,6 +481,7 @@ def check_metadata(reader, ip_version, record_size) def check_ipv4(reader, filename) 6.times do |i| address = "1.1.1.#{2**i}" + assert_equal( { 'ip' => address }, reader.get(address), @@ -492,6 +500,7 @@ def check_ipv4(reader, filename) } pairs.each do |key_address, value_address| data = { 'ip' => value_address } + assert_equal( data, reader.get(key_address), @@ -511,6 +520,7 @@ def check_ipv6(reader, filename) subnets = [ '::1:ffff:ffff', '::2:0:0', '::2:0:40', '::2:0:50', '::2:0:58', ] + subnets.each do |address| assert_equal( { 'ip' => address }, @@ -529,6 +539,7 @@ def check_ipv6(reader, filename) '::2:0:57' => '::2:0:50', '::2:0:59' => '::2:0:58', } + pairs.each do |key_address, value_address| assert_equal( { 'ip' => value_address },