@@ -124,6 +124,41 @@ public function testAmountZeroNotAllowed()
124
124
$ this ->changeProtectedProperty ('zeroAmountAllowed ' , false );
125
125
$ this ->request ->setAmount ('0.00 ' );
126
126
$ this ->request ->getAmount ();
127
+ }
128
+
129
+ // See https://github.com/thephpleague/omnipay-common/issues/69
130
+ public function testAmountPrecision ()
131
+ {
132
+ // The default precision for PHP is 6 decimal places.
133
+ ini_set ('precision ' , 6 );
134
+ $ this ->assertSame ($ this ->request , $ this ->request ->setAmount ('67.10 ' ));
135
+ $ this ->assertSame ('67.10 ' , $ this ->request ->getAmount ());
136
+
137
+ // At 17 decimal places, 67.10 will echo as 67.09999...
138
+ // This is *why* PHP sets the default precision at 6.
139
+ ini_set ('precision ' , 17 );
140
+ $ this ->assertSame ('67.10 ' , $ this ->request ->getAmount ());
141
+
142
+ $ this ->assertSame ($ this ->request , $ this ->request ->setAmount ('67.01 ' ));
143
+ $ this ->assertSame ('67.01 ' , $ this ->request ->getAmount ());
144
+
145
+ $ this ->assertSame ($ this ->request , $ this ->request ->setAmount ('0.10 ' ));
146
+ $ this ->assertSame ('0.10 ' , $ this ->request ->getAmount ());
147
+
148
+ $ this ->assertSame ($ this ->request , $ this ->request ->setAmount ('0.01 ' ));
149
+ $ this ->assertSame ('0.01 ' , $ this ->request ->getAmount ());
150
+ }
151
+
152
+ /**
153
+ * @expectedException Omnipay\Common\Exception\InvalidRequestException
154
+ *
155
+ * We still want to catch obvious fractions of the minor units that are
156
+ * not precision errors at a much lower level.
157
+ */
158
+ public function testAmountPrecisionTooHigh ()
159
+ {
160
+ $ this ->assertSame ($ this ->request , $ this ->request ->setAmount ('123.005 ' ));
161
+ $ this ->assertSame ('123.005 ' , $ this ->request ->getAmount ());
127
162
}
128
163
129
164
public function testGetAmountNoDecimals ()
0 commit comments