require 'rails_helper' RSpec.describe MaterialExportItem, type: :model do let(:user) { create(:user, :member) } let(:tag) { Tag.create!(tag_name: TagName.create!(name: 'export_item'), category: :material) } let(:material) do Material.create!(tag:, url: 'https://example.com/material', created_by_user: user, updated_by_user: user) end it 'rejects blank export_path' do item = described_class.new(material:, profile: 'legacy_drive', export_path: '') expect(item).not_to be_valid expect(item.errors[:export_path]).to be_present end it 'rejects absolute export_path' do item = described_class.new(material:, profile: 'legacy_drive', export_path: '/素材/a.png') expect(item).not_to be_valid expect(item.errors[:export_path]).to be_present end it 'rejects parent traversal export_path' do item = described_class.new(material:, profile: 'legacy_drive', export_path: '素材/../a.png') expect(item).not_to be_valid expect(item.errors[:export_path]).to be_present end it 'rejects double slash export_path' do item = described_class.new(material:, profile: 'legacy_drive', export_path: '素材//a.png') expect(item).not_to be_valid expect(item.errors[:export_path]).to be_present end it 'rejects dot segment export_path' do item = described_class.new(material:, profile: 'legacy_drive', export_path: './素材/a.png') expect(item).not_to be_valid expect(item.errors[:export_path]).to be_present end it 'rejects trailing slash export_path' do item = described_class.new(material:, profile: 'legacy_drive', export_path: '素材/a/') expect(item).not_to be_valid expect(item.errors[:export_path]).to be_present end end