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

pulibrary / tigerdata-app / d7ce1bf9-25b8-4b3e-b9dd-43f9a26f2d96

17 Oct 2025 05:51PM UTC coverage: 91.054%. Remained the same
d7ce1bf9-25b8-4b3e-b9dd-43f9a26f2d96

Pull #2055

circleci

jrgriffiniii
- Ensuring that `parallelism` is set to 4
- Separating `system` RSpec spec suites in the CI build
- Using an `inconsistent` RSpec tag to mark inconsistently failing tests
- Ensuring that CI does not run for `inconsistent` tests
Pull Request #2055: Ensuring that `parallelism` is set to 4 for CircleCI and separates `system` and inconsistently-failing tests into separate CI jobs

2738 of 3007 relevant lines covered (91.05%)

380.37 hits per line

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

100.0
/app/models/request.rb
1
# frozen_string_literal: true
2
# rubocop:disable Metrics/ClassLength
3
class Request < ApplicationRecord
5✔
4
  DRAFT = "draft" # default state set by database
5✔
5
  SUBMITTED = "submitted" # Ready to be approved
5✔
6

7
  def valid_to_submit?
5✔
8
    errors.clear
65✔
9
    # run all validations and then check for errors otherwise ruby stops at the first error
10
    valid_title?
65✔
11
    valid_data_sponsor?
65✔
12
    valid_data_manager?
65✔
13
    valid_departments?
65✔
14
    valid_quota?
65✔
15
    valid_project_purpose?
65✔
16
    valid_description?
65✔
17
    # Is parent folder really required?  For Skeletor let's skip it.
18
    # valid_parent_folder?
19
    valid_project_folder?
65✔
20
    # For Skeletor we are setting the requestor to the data sponsor
21
    # valid_requested_by?
22
    errors.count == 0
65✔
23
  end
24

25
  def valid_title?
5✔
26
    valid_title_present?(project_title, :project_title)
71✔
27
  end
28

29
  def valid_data_sponsor?
5✔
30
    valid_uid?(data_sponsor, :data_sponsor)
68✔
31
  end
32

33
  def valid_data_manager?
5✔
34
    valid_uid?(data_manager, :data_manager)
68✔
35
  end
36

37
  def valid_departments?
5✔
38
    field_present?(departments, :departments)
67✔
39
  end
40

41
  def valid_project_purpose?
5✔
42
    project_purpose_present?(project_purpose, :project_purpose)
65✔
43
  end
44

45
  def valid_description?
5✔
46
    valid_description_present?(description, :description)
67✔
47
  end
48

49
  def valid_parent_folder?
5✔
50
    field_present?(parent_folder, :parent_folder)
2✔
51
  end
52

53
  def valid_project_folder?
5✔
54
    field_present?(project_folder, :project_folder)
67✔
55
  end
56

57
  def valid_quota?
5✔
58
    if ((quota == "500 GB") || (quota == "2 TB") || (quota == "10 TB") || (quota == "25 TB")) ||
73✔
59
       (custom_quota? && (storage_size.present? && (storage_size > 0)) && ((storage_unit == "GB") || (storage_unit == "TB")))
5✔
60
      true
70✔
61
    else
62
      errors.add(:quota, :invalid, message: "must be one of '500 GB', '2 TB', '10 TB', '25 TB', or 'custom'")
3✔
63
      false
3✔
64
    end
65
  end
66

67
  def custom_quota?
5✔
68
    quota == "custom"
325✔
69
  end
70

71
  def valid_requested_by?
5✔
72
    field_present?(requested_by, :requested_by)
2✔
73
  end
74

75
  def approve(approver)
5✔
76
    create_project_operation = ProjectCreate.new
116✔
77
    result = create_project_operation.call(request: self, approver: approver)
116✔
78
    if result.success?
116✔
79
      result.value!
113✔
80
    else
81
      self.error_message = { message: result.failure }
3✔
82
      save!
3✔
83
      cleanup_incomplete_project
3✔
84
      raise ProjectCreate::ProjectCreateError, result.failure
3✔
85
    end
86
  end
87

88
  def approved_quota_size
5✔
89
    if approved_quota.present?
127✔
90
      if approved_quota == "custom"
106✔
91
        approved_storage_size.to_f
105✔
92
      else
93
        approved_quota.split.first.to_f
1✔
94
      end
95
    else
96
      requested_quota_size
21✔
97
    end
98
  end
99

100
  def requested_quota_size
5✔
101
    if custom_quota?
160✔
102
      storage_size.to_f
110✔
103
    else
104
      quota.split.first.to_f
50✔
105
    end
106
  end
107

108
  def approved_quota_unit
5✔
109
    if approved_quota.present?
130✔
110
      if approved_quota == "custom"
108✔
111
        approved_storage_unit
107✔
112
      else
113
        approved_quota.split.last
1✔
114
      end
115
    else
116
      requested_quota_unit
22✔
117
    end
118
  end
119

120
  def requested_quota_unit
5✔
121
    if custom_quota?
160✔
122
      storage_unit
110✔
123
    else
124
      quota.split.last
50✔
125
    end
126
  end
127

128
  def submitted?
5✔
129
    state == Request::SUBMITTED
86✔
130
  end
131

132
  private
5✔
133

134
    def field_present?(value, name)
5✔
135
      if value.present?
138✔
136
        true
92✔
137
      else
138
        errors.add(name, :invalid, message: "cannot be empty")
46✔
139
        false
46✔
140
      end
141
    end
142

143
    def valid_uid?(uid, field)
5✔
144
      if uid.blank?
136✔
145
        errors.add(field, :blank, message: "cannot be empty")
37✔
146
        false
37✔
147
      elsif User.where(uid: uid).count == 0
99✔
148
        errors.add(field, :invalid, message: "must be a valid user")
2✔
149
        false
2✔
150
      else
151
        true
97✔
152
      end
153
    end
154

155
    def project_purpose_present?(project_purpose, field)
5✔
156
      if project_purpose.blank?
65✔
157
        errors.add(field, :blank, message: "select a project purpose")
25✔
158
        false
25✔
159
      else
160
        true
40✔
161
      end
162
    end
163

164
    def valid_description_present?(description, field)
5✔
165
      if description.blank?
67✔
166
        errors.add(field, :blank, message: "cannot be empty")
27✔
167
        false
27✔
168
      elsif description.length > 1000
40✔
169
        errors.add(field, :invalid, message: "description cannot exceed 1000 characters")
2✔
170
        false
2✔
171
      else
172
        true
38✔
173
      end
174
    end
175

176
    def valid_title_present?(project_title, field)
5✔
177
      if project_title.blank?
71✔
178
        errors.add(field, :blank, message: "cannot be empty")
13✔
179
        false
13✔
180
      elsif project_title.length > 200
58✔
181
        errors.add(field, :invalid, message: "project title cannot exceed 200 characters")
2✔
182
        false
2✔
183
      else
184
        true
56✔
185
      end
186
    end
187

188
    # If a request fails to be a approved we make sure there were not orphan
189
    # project records left in our Rails database that do not have a matching
190
    # project in Mediaflux (i.e. collection asset).
191
    def cleanup_incomplete_project
5✔
192
      project = Project.find_by_id(project_id)
3✔
193
      if project && project.mediaflux_id.nil?
3✔
194
        Rails.logger.warn("Deleting project #{project.id} because the approval for request #{id} failed and it was not created in Mediaflux.")
2✔
195
        project.destroy!
2✔
196
      end
197
    end
198
end
199
# rubocop:enable Metrics/ClassLength
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