Nokogiri версии 1.10.5 и выше дают ложную положительную оценку против ONIX XSD - PullRequest
0 голосов
/ 05 января 2020

Версии Nokogiri 1.10.5 и более поздние приводят к различным ошибкам проверки версии 1.10.4 относительно XSD-файлов ONIX v2.1 и v3, и я не могу найти каких-либо коммитов в этом выпуске и измененных зависимостей ( libxml2-2.9.10 и libxslt 1.1.34 ), что может вызвать такое изменение в поведении.

Я создал небольшой пример недопустимого ONIX XML (ff - недопустимая запись списка в <ProductForm>ff</ProductForm>):

XSD_FILE = 'reference/ONIX_BookProduct_Release2.1_reference.xsd'.freeze

VALIDATION_NODE = <<-END_XML.freeze
  <?xml version=\"1.0\" encoding=\"UTF-8\"?>
  <ONIXMessage xmlns=\"http://www.editeur.org/onix/2.1/reference\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.editeur.org/onix/2.1/reference #{XSD_FILE}\">
    <Header>
      <FromCompany>Company</FromCompany>
      <ToCompany>OtherCompany</ToCompany>
      <SentDate>20140912</SentDate>
    </Header>
    <Product>
      <RecordReference>9780954575915</RecordReference>
      <NotificationType>03</NotificationType>
      <ProductIdentifier>
        <!-- GTIN-13 -->
        <ProductIDType>03</ProductIDType>
        <IDValue>9780954575915</IDValue>
      </ProductIdentifier>
      <ProductIdentifier>
        <!-- ISBN -->
        <ProductIDType>15</ProductIDType>
        <IDValue>9780954575915</IDValue>
      </ProductIdentifier>
      <ProductIdentifier>
        <ProductIDType>01</ProductIDType>
        <IDTypeName>Publisher's Reference</IDTypeName>
        <IDValue>publishers_reference</IDValue>
      </ProductIdentifier>
      <ProductForm>ff</ProductForm>
      <ProductFormDetail>B401</ProductFormDetail>
    </Product>
  </ONIXMessage>
END_XML

И создал для него тест, который использует ONIX XSD:

gem 'nokogiri', '1.10.4'
require 'nokogiri'
require 'minitest/autorun'
require_relative '../reference/constants.rb'

class Test < MiniTest::Spec
  describe "XSD validation of invalid ONIX 2.1 XML using Nokogiri 1.10.4" do
    it "should produce validation errors" do
      product = Nokogiri::XML(VALIDATION_NODE)
      errors = Nokogiri::XML::Schema(File.open(XSD_FILE)).
               validate(product).
               map(&:to_s)

      # declutter the errors
      errors.map! {|e| e.gsub("{http://www.editeur.org/onix/2.1/reference}", "")}

      assert_equal [
        "26:0: ERROR: Element 'ProductForm': [facet 'enumeration'] The value 'ff' is not an element of the set {'00', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AZ', 'BA', 'BB', 'BC', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BK', 'BL', 'BM', 'BN', 'BO', 'BP', 'BZ', 'CA', 'CB', 'CC', 'CD', 'CE', 'CZ', 'DA', 'DB', 'DC', 'DD', 'DE', 'DF', 'DG', 'DH', 'DI', 'DJ', 'DK', 'DL', 'DM', 'DN', 'DO', 'DZ', 'FA', 'FB', 'FC', 'FD', 'FE', 'FF', 'FZ', 'MA', 'MB', 'MC', 'MZ', 'PA', 'PB', 'PC', 'PD', 'PE', 'PF', 'PG', 'PH', 'PI', 'PJ', 'PK', 'PL', 'PM', 'PN', 'PO', 'PP', 'PQ', 'PR', 'PS', 'PT', 'PZ', 'VA', 'VB', 'VC', 'VD', 'VE', 'VF', 'VG', 'VH', 'VI', 'VJ', 'VK', 'VL', 'VM', 'VN', 'VO', 'VP', 'VZ', 'WW', 'WX', 'XA', 'XB', 'XC', 'XD', 'XE', 'XF', 'XG', 'XH', 'XI', 'XJ', 'XK', 'XL', 'XM', 'XZ', 'ZA', 'ZB', 'ZC', 'ZD', 'ZE', 'ZF', 'ZG', 'ZH', 'ZI', 'ZJ', 'ZY', 'ZZ'}.",
        "26:0: ERROR: Element 'ProductForm': 'ff' is not a valid value of the atomic type 'List7'.",
        "8:0: ERROR: Element 'Product': Missing child element(s). Expected is one of ( ProductFormDetail, ProductFormFeature, BookFormDetail, ProductPackaging, ProductFormDescription, NumberOfPieces, TradeCategory, ProductContentType, ContainedItem, ProductClassification ).",
      ],
      errors
    end
  end
end

Тест проходит при указании версии 1.10.4 и завершается с ошибкой в ​​1.10.5 и выше, поскольку он не возвращает следующую ошибку:

"26:0: ERROR: Element 'ProductForm': 'ff' is not a valid value of the atomic type 'List7'."

Вот zip-файл с тестовыми приспособлениями, по проблеме, поднятой в репозитории gem, которую вы можете запустить с $ ruby -Ilib:test 1.10.4/test_case.rb и $ ruby -Ilib:test 1.10.5/test_case.rb

...