• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pulibrary / pdc_describe / 25744549-a0ce-4a94-be72-211b26360e47

04 Apr 2024 02:57PM UTC coverage: 95.316% (-0.5%) from 95.842%
25744549-a0ce-4a94-be72-211b26360e47

Pull #1739

circleci

JaymeeH
changing routes so that the next button on additional metadata goes to the readme
figuring out how to show the second pane by default for the additional metadata
Pull Request #1739: 1684 additional step

10 of 10 new or added lines in 1 file covered. (100.0%)

20 existing lines in 4 files now uncovered.

3215 of 3373 relevant lines covered (95.32%)

187.21 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

99.01
/app/services/work_validator.rb
1
# frozen_string_literal: true
2
class WorkValidator
1✔
3
  attr_reader :work
1✔
4

5
  delegate :errors, :metadata, :resource, :ark, :doi, :user_entered_doi, :id, :group,
1✔
6
           :pre_curation_uploads_fast, :post_curation_uploads, to: :work
7

8
  def initialize(work)
1✔
9
    @work = work
824✔
10
  end
11

12
  def valid?
1✔
13
    if work.none?
1,039✔
14
      validate_ids
106✔
15
    elsif work.draft?
933✔
16
      valid_to_draft
674✔
17
    else
18
      valid_to_submit
259✔
19
    end
20
  end
21

22
  def valid_to_draft(*)
1✔
23
    errors.add(:base, "Must provide a title") if resource.main_title.blank?
1,055✔
24
    validate_ark
1,055✔
25
    validate_creators
1,055✔
26
    validate_related_objects if resource.present? && !resource.related_objects.empty?
1,055✔
27
    errors.count == 0
1,055✔
28
  end
29

30
  def valid_to_submit(*args)
1✔
31
    valid_to_draft(args)
322✔
32
    validate_metadata
322✔
33
    if errors.count == 0
322✔
34
      valid_datacite? # test if the datacite update will be valid
319✔
35
    end
36
    errors.count == 0
322✔
37
  end
38

39
  def valid_to_approve(user)
1✔
40
    if resource.doi.blank?
37✔
41
      errors.add :base, "DOI must be present for a work to be approved"
1✔
42
    end
43
    valid_to_submit(user)
37✔
44
    unless user.has_role? :group_admin, group
37✔
45
      errors.add :base, "Unauthorized to Approve"
4✔
46
    end
47
    if pre_curation_uploads_fast.empty? && post_curation_uploads.empty?
37✔
48
      errors.add :base, "Uploads must be present for a work to be approved"
2✔
49
    end
50
    errors.count == 0
37✔
51
  end
52

53
  def valid_datacite?
1✔
54
    datacite_serialization = resource.datacite_serialization
322✔
55
    datacite_serialization.valid?
320✔
56
    datacite_serialization.errors.each { |error| errors.add(:base, error) }
321✔
57
    errors.count == 0
320✔
58
  rescue ArgumentError => error
59
    argument_path = error.backtrace_locations.first.path
2✔
60
    argument_file = argument_path.split("/").last
2✔
61
    argument_name = argument_file.split(".").first
2✔
62
    errors.add(:base, "#{argument_name.titleize}: #{error.message}")
2✔
63
    false
2✔
64
  end
65

66
  private
1✔
67

68
    def validate_ark
1✔
69
      return if ark.blank?
1,055✔
70
      return false unless unique_ark
124✔
71
      first_save = id.blank?
123✔
72
      changed_value = metadata["ark"] != ark
123✔
73
      if first_save || changed_value
123✔
74
        errors.add(:base, "Invalid ARK provided for the Work: #{ark}") unless Ark.valid?(ark)
58✔
75
      end
76
    end
77

78
    def validate_related_objects
1✔
79
      return if resource.related_objects.empty?
365✔
80
      invalid = resource.related_objects.reject(&:valid?)
47✔
81
      if invalid.count.positive?
47✔
82
        related_object_errors = "Related Objects are invalid: "
3✔
83
        prev_errors = errors.to_a
3✔
84
        prev_related_object_errors = prev_errors.map { |e| e.include?(related_object_errors) }.reduce(:|)
4✔
85

86
        errors.add(:base, "#{related_object_errors}#{invalid.map(&:errors).join(', ')}") unless prev_related_object_errors
3✔
87
      end
88
    end
89

90
    def validate_creators
1✔
91
      if resource.creators.count == 0
1,377✔
92
        errors.add(:base, "Must provide at least one Creator")
1✔
93
      else
94
        resource.creators.each do |creator|
1,376✔
95
          if creator.orcid.present? && Orcid.invalid?(creator.orcid)
1,984✔
96
            errors.add(:base, "ORCID for creator #{creator.value} is not in format 0000-0000-0000-0000")
1✔
97
          end
98
        end
99
      end
100
    end
101

102
    def validate_required_metadata
1✔
103
      return if metadata.blank?
322✔
104
      errors.add(:base, "Must provide a title") if resource.main_title.blank?
322✔
105
      validate_creators
322✔
106
    end
107

108
    def validate_doi
1✔
109
      return true unless user_entered_doi
106✔
110
      return false unless unique_doi
3✔
111
      if /^10.\d{4,9}\/[-._;()\/:a-z0-9\-]+$/.match?(doi.downcase)
2✔
112
        response = Faraday.get("#{Rails.configuration.datacite.doi_url}#{doi}")
2✔
113
        errors.add(:base, "Invalid DOI: can not verify it's authenticity") unless response.success? || response.status == 302
2✔
114
      else
UNCOV
115
        errors.add(:base, "Invalid DOI: does not match format")
×
116
      end
117
      errors.count == 0
2✔
118
    end
119

120
    def unique_ark
1✔
121
      return true if ark.blank?
230✔
122
      other_record = Work.find_by_ark(ark)
194✔
123
      return true if other_record == work
65✔
124
      errors.add(:base, "Invalid ARK: It has already been applied to another work #{other_record.id}")
1✔
125
      false
1✔
126
    rescue ActiveRecord::RecordNotFound
127
      true
129✔
128
    end
129

130
    def validate_ids
1✔
131
      validate_doi
106✔
132
      unique_ark
106✔
133
    end
134

135
    def unique_doi
1✔
136
      other_record = Work.find_by_doi(doi)
3✔
137
      return true if other_record == work
2✔
138
      errors.add(:base, "Invalid DOI: It has already been applied to another work #{other_record.id}")
1✔
139
      false
1✔
140
    rescue ActiveRecord::RecordNotFound
141
      true
1✔
142
    end
143

144
    def validate_metadata
1✔
145
      return if metadata.blank?
322✔
146
      validate_required_metadata
322✔
147
      errors.add(:base, "Must provide a description") if resource.description.blank?
322✔
148
      errors.add(:base, "Must indicate the Publisher") if resource.publisher.blank?
322✔
149
      errors.add(:base, "Must indicate the Publication Year") if resource.publication_year.blank?
322✔
150
      errors.add(:base, "Must indicate at least one Rights statement") if resource.rights_many.count == 0
322✔
151
      errors.add(:base, "Must provide a Version number") if resource.version_number.blank?
322✔
152
      validate_related_objects
322✔
153
    end
154
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc