importable_spec.rb 5.06 KB
RSpec.describe TalltyImportExport::Importable do
  before do
    class Test
      include TalltyImportExport::Importable

      class << self
        def model_headers
          [
            { key: 'name', name: '名称' },
            { key: 'code', name: '学号', convert: :handle_code },
            { key: 'sub_code', name: '副学号', convert: :skip },
            { key: 'meta1', name: 'meta字段1', json: :meta },
            { key: 'meta2', name: 'meta字段2', json: :meta },
            { key: 'sum', name: '累计值', convert: :handle_sum }, # 表格里 name 为 累加值
          ]
        end
      end

      class Import
        def import_record line_info, associations
          associations << line_info
        end

        def handle_code code, processing_line_info, raw_line_info
          "#{code}_#{raw_line_info[:sub_code]}"
        end

        def handle_sum num, processing_line_info, raw_line_info
          context.last_line_info ? context.last_line_info['sum'] + num : num
        end
      end
    end
  end

  it 'import file directly' do
    # 名称	学号	  副学号	meta字段1	meta字段2 累加值
    # 1	  20070101	1	    meta1	    metaA     1
    # 2	  20070102	2	    meta2	    metaB     2
    # 3	  20070103	3	    meta3	    metaC     3
    # 4	  20070104	4	    meta4	    metaD     4
    # 5	  20070105	5	    meta5	    metaE     5
    @result = []
    Test.import_xlsx('./spec/test1.xlsx', @result,
      headers: [
        { key: 'name', name: '名称' },
        { key: 'code', name: '学号' },
        { key: 'sub_code', name: '副学号' },
        { key: 'meta1', name: 'meta字段1', json: :meta },
        { key: 'meta2', name: 'meta字段2', json: :meta },
        { key: 'sum', name: '累加值' },
      ]
  )

    expect(@result).to eq([
      {"name"=>1, "code"=>"20070101_1", "sub_code"=>nil, "meta"=>{"meta1"=>"meta1", "meta2"=>"metaA" }, "sum" => 1 },
      {"name"=>2, "code"=>"20070102_2", "sub_code"=>nil, "meta"=>{"meta1"=>"meta2", "meta2"=>"metaB" }, "sum" => 3 },
      {"name"=>3, "code"=>"20070103_3", "sub_code"=>nil, "meta"=>{"meta1"=>"meta3", "meta2"=>"metaC" }, "sum" => 6 },
      {"name"=>4, "code"=>"20070104_4", "sub_code"=>nil, "meta"=>{"meta1"=>"meta4", "meta2"=>"metaD" }, "sum" => 10 },
      {"name"=>5, "code"=>"20070105_5", "sub_code"=>nil, "meta"=>{"meta1"=>"meta5", "meta2"=>"metaE" }, "sum" => 15 },
    ])
  end

  it 'import excel object' do
    # 名称	学号	  副学号	meta字段1	meta字段2 累加值
    # 1	  20070101	1	    meta1	    metaA     1
    # 2	  20070102	2	    meta2	    metaB     2
    # 3	  20070103	3	    meta3	    metaC     3
    # 4	  20070104	4	    meta4	    metaD     4
    # 5	  20070105	5	    meta5	    metaE     5
    @result = []

    @excel = TalltyImportExport::Excel.new
    @excel.load('./spec/test1.xlsx')

    Test.import_xlsx(@excel, @result,
      headers: [
        { key: 'name', name: '名称' },
        { key: 'code', name: '学号' },
        { key: 'sub_code', name: '副学号' },
        { key: 'meta1', name: 'meta字段1', json: :meta },
        { key: 'meta2', name: 'meta字段2', json: :meta },
        { key: 'sum', name: '累加值' },
      ]
    )

    expect(@result).to eq([
      {"name"=>1, "code"=>"20070101_1", "sub_code"=>nil, "meta"=>{"meta1"=>"meta1", "meta2"=>"metaA" }, "sum" => 1 },
      {"name"=>2, "code"=>"20070102_2", "sub_code"=>nil, "meta"=>{"meta1"=>"meta2", "meta2"=>"metaB" }, "sum" => 3 },
      {"name"=>3, "code"=>"20070103_3", "sub_code"=>nil, "meta"=>{"meta1"=>"meta3", "meta2"=>"metaC" }, "sum" => 6 },
      {"name"=>4, "code"=>"20070104_4", "sub_code"=>nil, "meta"=>{"meta1"=>"meta4", "meta2"=>"metaD" }, "sum" => 10 },
      {"name"=>5, "code"=>"20070105_5", "sub_code"=>nil, "meta"=>{"meta1"=>"meta5", "meta2"=>"metaE" }, "sum" => 15 },
    ])
  end

  it 'import data' do
    @result = []
    @data = [
      { '名称' => 1, '学号'	=> '20070101', '副学号' => 1, 'meta字段1' =>	'meta1', 'meta字段2' =>	'metaA', '累加值' => 1 },
      { '名称' => 2, '学号'	=> '20070102', '副学号' => 2, 'meta字段1' =>	'meta2', 'meta字段2' =>	'metaB', '累加值' => 2 },
      { '名称' => 3, '学号'	=> '20070103', '副学号' => 3, 'meta字段1' =>	'meta3', 'meta字段2' =>	'metaC', '累加值' => 3 },
      { '名称' => 4, '学号'	=> '20070104', '副学号' => 4, 'meta字段1' =>	'meta4', 'meta字段2' =>	'metaD', '累加值' => 4 },
      { '名称' => 5, '学号'	=> '20070105', '副学号' => 5, 'meta字段1' =>	'meta5', 'meta字段2' =>	'metaE', '累加值' => 5 },
    ]

    Test.import_data(@data, @result)

    expect(@result).to eq([
      {"name"=>1, "code"=>"20070101_1", "sub_code"=>nil, "meta"=>{"meta1"=>"meta1", "meta2"=>"metaA" }},
      {"name"=>2, "code"=>"20070102_2", "sub_code"=>nil, "meta"=>{"meta1"=>"meta2", "meta2"=>"metaB" }},
      {"name"=>3, "code"=>"20070103_3", "sub_code"=>nil, "meta"=>{"meta1"=>"meta3", "meta2"=>"metaC" }},
      {"name"=>4, "code"=>"20070104_4", "sub_code"=>nil, "meta"=>{"meta1"=>"meta4", "meta2"=>"metaD" }},
      {"name"=>5, "code"=>"20070105_5", "sub_code"=>nil, "meta"=>{"meta1"=>"meta5", "meta2"=>"metaE" }},
    ])
  end
end