Skip to content

Commit b19807b

Browse files
committed
Put everything together
1 parent f081789 commit b19807b

File tree

9 files changed

+423
-0
lines changed

9 files changed

+423
-0
lines changed

.DS_Store

6 KB
Binary file not shown.

src/main/java/dev/ditsche/validator/rule/builder/Rules.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,8 @@ public static ArrayRuleBuilder array(String field) {
2525
return new ArrayRuleBuilder(field);
2626
}
2727

28+
public static TemporalRuleBuilder temporal(String field) {
29+
return new TemporalRuleBuilder(field);
30+
}
31+
2832
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package dev.ditsche.validator.rule.builder;
2+
3+
import dev.ditsche.validator.rule.Rule;
4+
import dev.ditsche.validator.rule.ruleset.AfterRule;
5+
import dev.ditsche.validator.rule.ruleset.BeforeRule;
6+
import dev.ditsche.validator.rule.ruleset.RequiredRule;
7+
import dev.ditsche.validator.rule.ruleset.TemporalRule;
8+
import dev.ditsche.validator.validation.Validatable;
9+
import dev.ditsche.validator.validation.ValidationField;
10+
11+
import java.sql.Timestamp;
12+
import java.time.LocalDate;
13+
import java.time.LocalDateTime;
14+
import java.time.LocalTime;
15+
import java.util.Date;
16+
import java.util.LinkedList;
17+
18+
public class TemporalRuleBuilder extends RuleBuilder {
19+
20+
private final String field;
21+
22+
private boolean optional = false;
23+
24+
TemporalRuleBuilder(String field) {
25+
this.field = field;
26+
this.rules = new LinkedList<>();
27+
this.rules.add(new TemporalRule());
28+
}
29+
30+
public TemporalRuleBuilder optional() {
31+
this.optional = true;
32+
return this;
33+
}
34+
35+
public TemporalRuleBuilder future() {
36+
this.rules.add(new AfterRule());
37+
return this;
38+
}
39+
40+
public TemporalRuleBuilder past() {
41+
this.rules.add(new BeforeRule());
42+
return this;
43+
}
44+
45+
public TemporalRuleBuilder after(LocalDateTime now) {
46+
this.rules.add(new AfterRule(now));
47+
return this;
48+
}
49+
50+
public TemporalRuleBuilder after(LocalDate now) {
51+
this.rules.add(new AfterRule(now));
52+
return this;
53+
}
54+
55+
public TemporalRuleBuilder after(LocalTime now) {
56+
this.rules.add(new AfterRule(now));
57+
return this;
58+
}
59+
60+
public TemporalRuleBuilder after(Timestamp now) {
61+
this.rules.add(new AfterRule(now));
62+
return this;
63+
}
64+
65+
public TemporalRuleBuilder after(Date now) {
66+
this.rules.add(new AfterRule(now));
67+
return this;
68+
}
69+
70+
public TemporalRuleBuilder before(LocalDateTime now) {
71+
this.rules.add(new BeforeRule(now));
72+
return this;
73+
}
74+
75+
public TemporalRuleBuilder before(LocalDate now) {
76+
this.rules.add(new BeforeRule(now));
77+
return this;
78+
}
79+
80+
public TemporalRuleBuilder before(LocalTime now) {
81+
this.rules.add(new BeforeRule(now));
82+
return this;
83+
}
84+
85+
public TemporalRuleBuilder before(Timestamp now) {
86+
this.rules.add(new BeforeRule(now));
87+
return this;
88+
}
89+
90+
public TemporalRuleBuilder before(Date now) {
91+
this.rules.add(new BeforeRule(now));
92+
return this;
93+
}
94+
95+
public TemporalRuleBuilder required() {
96+
this.rules.add(new RequiredRule());
97+
return this;
98+
}
99+
100+
@Override
101+
public TemporalRuleBuilder custom(Rule rule) {
102+
this.rules.add(rule);
103+
return this;
104+
}
105+
106+
@Override
107+
public Validatable build() {
108+
return new ValidationField(this.field, this.rules, this.optional);
109+
}
110+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package dev.ditsche.validator.rule.ruleset;
2+
3+
import dev.ditsche.validator.rule.Rule;
4+
import dev.ditsche.validator.rule.RuleResult;
5+
6+
import java.sql.Timestamp;
7+
import java.time.LocalDate;
8+
import java.time.LocalDateTime;
9+
import java.time.LocalTime;
10+
import java.time.format.DateTimeFormatter;
11+
import java.util.Date;
12+
13+
public class AfterRule implements Rule {
14+
15+
private final LocalDateTime relative;
16+
17+
public AfterRule() {
18+
this(LocalDateTime.now());
19+
}
20+
21+
public AfterRule(Date date) {
22+
this(new Timestamp(date.getTime()));
23+
}
24+
25+
public AfterRule(Timestamp date) {
26+
this(date.toLocalDateTime());
27+
}
28+
29+
public AfterRule(LocalDate now) {
30+
this(LocalDateTime.of(now, LocalTime.MIN));
31+
}
32+
33+
public AfterRule(LocalTime now) {
34+
this(LocalDateTime.of(LocalDate.MIN, now));
35+
}
36+
37+
public AfterRule(LocalDateTime now) {
38+
relative = now;
39+
}
40+
41+
@Override
42+
public RuleResult test(Object value) {
43+
44+
if(value instanceof Date) {
45+
return RuleResult.passes(((Date) value).after(Timestamp.valueOf(relative)));
46+
}
47+
48+
if(value instanceof LocalDateTime) {
49+
LocalDateTime dt = (LocalDateTime) value;
50+
return RuleResult.passes(dt.isAfter(relative));
51+
}
52+
if(value instanceof LocalDate) {
53+
LocalDate dt = (LocalDate) value;
54+
return RuleResult.passes(dt.isAfter(relative.toLocalDate()));
55+
}
56+
if(value instanceof LocalTime) {
57+
LocalTime dt = (LocalTime) value;
58+
return RuleResult.passes(dt.isAfter(relative.toLocalTime()));
59+
}
60+
61+
return RuleResult.reject();
62+
}
63+
64+
@Override
65+
public String message(String field) {
66+
return String.format("The field \"%s\" needs to be after %s", field, relative.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
67+
}
68+
69+
@Override
70+
public String getType() {
71+
return RULE_TYPE_PREFIX + "temporal.future";
72+
}
73+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package dev.ditsche.validator.rule.ruleset;
2+
3+
import dev.ditsche.validator.rule.Rule;
4+
import dev.ditsche.validator.rule.RuleResult;
5+
6+
import java.sql.Timestamp;
7+
import java.time.LocalDate;
8+
import java.time.LocalDateTime;
9+
import java.time.LocalTime;
10+
import java.time.format.DateTimeFormatter;
11+
import java.util.Date;
12+
13+
public class BeforeRule implements Rule {
14+
15+
private final LocalDateTime relative;
16+
17+
public BeforeRule() {
18+
this(LocalDateTime.now());
19+
}
20+
21+
public BeforeRule(Date date) {
22+
this(new Timestamp(date.getTime()));
23+
}
24+
25+
public BeforeRule(Timestamp date) {
26+
this(date.toLocalDateTime());
27+
}
28+
29+
public BeforeRule(LocalDate now) {
30+
this(LocalDateTime.of(now, LocalTime.MIN));
31+
}
32+
33+
public BeforeRule(LocalTime now) {
34+
this(LocalDateTime.of(LocalDate.MIN, now));
35+
}
36+
37+
public BeforeRule(LocalDateTime now) {
38+
relative = now;
39+
}
40+
41+
@Override
42+
public RuleResult test(Object value) {
43+
44+
if(value instanceof Date) {
45+
return RuleResult.passes(((Date) value).before(Timestamp.valueOf(relative)));
46+
}
47+
48+
if(value instanceof LocalDateTime) {
49+
LocalDateTime dt = (LocalDateTime) value;
50+
return RuleResult.passes(dt.isBefore(relative));
51+
}
52+
if(value instanceof LocalDate) {
53+
LocalDate dt = (LocalDate) value;
54+
return RuleResult.passes(dt.isBefore(relative.toLocalDate()));
55+
}
56+
if(value instanceof LocalTime) {
57+
LocalTime dt = (LocalTime) value;
58+
return RuleResult.passes(dt.isBefore(relative.toLocalTime()));
59+
}
60+
61+
return RuleResult.reject();
62+
}
63+
64+
@Override
65+
public String message(String field) {
66+
return String.format("The field \"%s\" needs to be before %s", field, relative.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
67+
}
68+
69+
@Override
70+
public String getType() {
71+
return RULE_TYPE_PREFIX + "temporal.past";
72+
}
73+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package dev.ditsche.validator.rule.ruleset;
2+
3+
import dev.ditsche.validator.rule.Rule;
4+
import dev.ditsche.validator.rule.RuleResult;
5+
6+
import java.time.LocalDate;
7+
import java.time.LocalDateTime;
8+
import java.time.LocalTime;
9+
import java.util.Date;
10+
11+
public class TemporalRule implements Rule {
12+
13+
@Override
14+
public RuleResult test(Object value) {
15+
16+
if(value instanceof LocalDateTime)
17+
return RuleResult.resolve();
18+
19+
if(value instanceof LocalDate)
20+
return RuleResult.resolve();
21+
22+
if(value instanceof LocalTime)
23+
return RuleResult.resolve();
24+
25+
if(value instanceof Date)
26+
return RuleResult.resolve();
27+
28+
return RuleResult.reject();
29+
}
30+
31+
@Override
32+
public String message(String field) {
33+
return String.format("The field \"%s\" needs to be a date or timestamp", field);
34+
}
35+
36+
@Override
37+
public String getType() {
38+
return RULE_TYPE_PREFIX + "type.temporal";
39+
}
40+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package dev.ditsche.validator.rule.ruleset;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.sql.Timestamp;
6+
import java.time.LocalDate;
7+
import java.time.LocalDateTime;
8+
import java.time.LocalTime;
9+
import java.util.Date;
10+
import java.util.LinkedList;
11+
import java.util.stream.Stream;
12+
13+
import static org.assertj.core.api.Assertions.assertThat;
14+
15+
public class AfterRuleTest {
16+
17+
private final AfterRule afterRule = new AfterRule();
18+
19+
@Test
20+
public void shouldFailIfNoDateIsProvided() {
21+
Stream.of(null, 1, new LinkedList<>(), 2.00f, false).forEach(value -> assertThat(afterRule.test(value).isPassed()).isFalse());
22+
}
23+
24+
@Test
25+
public void shouldPassWithValidInput() {
26+
Stream.of(LocalDate.now(), LocalDateTime.now(), LocalTime.now(), new Date(), new Timestamp(new Date().getTime())).forEach(value -> assertThat(new AfterRule().test(value).isPassed()).isFalse());
27+
}
28+
29+
@Test
30+
public void shouldReturnValidErrorMessage() {
31+
assertThat(afterRule.message("test")).startsWith("The field \"test\" needs to be after");
32+
}
33+
34+
@Test
35+
public void shouldFailIfGivenDateIsBefore() {
36+
assertThat(afterRule.test(LocalDateTime.now().plusDays(-1)).isPassed()).isFalse();
37+
}
38+
39+
@Test
40+
public void shouldPassIfGivenDateIsAfter() {
41+
assertThat(afterRule.test(LocalDateTime.now().plusDays(1)).isPassed()).isTrue();
42+
}
43+
44+
}

0 commit comments

Comments
 (0)