tend-ruby 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +24 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/LICENSE.txt +22 -0
- data/README.md +39 -0
- data/Rakefile +12 -0
- data/lib/tend/errors/http_error.rb +10 -0
- data/lib/tend/errors/not_supported_error.rb +2 -0
- data/lib/tend/models/campaign.rb +16 -0
- data/lib/tend/models/contact.rb +47 -0
- data/lib/tend/models/garden.rb +50 -0
- data/lib/tend/models/page.rb +13 -0
- data/lib/tend/models/referrer.rb +20 -0
- data/lib/tend/models/segment.rb +24 -0
- data/lib/tend/models/visit.rb +13 -0
- data/lib/tend/util/ht.rb +58 -0
- data/lib/tend/util/no_delete.rb +16 -0
- data/lib/tend/util/no_find.rb +17 -0
- data/lib/tend/util/no_post.rb +17 -0
- data/lib/tend/util/no_update.rb +16 -0
- data/lib/tend/util/util.rb +53 -0
- data/lib/tend.rb +34 -0
- data/lib/version.rb +3 -0
- data/tend-ruby.gemspec +29 -0
- data/test/fixtures/campaign.json +15 -0
- data/test/fixtures/contact.json +13 -0
- data/test/fixtures/page.json +3 -0
- data/test/fixtures/referrer.json +11 -0
- data/test/fixtures/segment.json +21 -0
- data/test/fixtures/vcr/campaign_all.yml +67 -0
- data/test/fixtures/vcr/campaign_contacts.yml +39 -0
- data/test/fixtures/vcr/campaign_delete.yml +39 -0
- data/test/fixtures/vcr/campaign_find.yml +40 -0
- data/test/fixtures/vcr/campaign_update.yml +39 -0
- data/test/fixtures/vcr/campaign_visits.yml +40 -0
- data/test/fixtures/vcr/contact_all.yml +41 -0
- data/test/fixtures/vcr/contact_delete.yml +41 -0
- data/test/fixtures/vcr/contact_find.yml +41 -0
- data/test/fixtures/vcr/contact_segments.yml +39 -0
- data/test/fixtures/vcr/contact_update.yml +42 -0
- data/test/fixtures/vcr/contact_visits.yml +89 -0
- data/test/fixtures/vcr/page_all.yml +39 -0
- data/test/fixtures/vcr/referrer_all.yml +39 -0
- data/test/fixtures/vcr/referrer_contacts.yml +39 -0
- data/test/fixtures/vcr/referrer_find.yml +39 -0
- data/test/fixtures/vcr/referrer_visits.yml +39 -0
- data/test/fixtures/vcr/segment_all.yml +43 -0
- data/test/fixtures/vcr/segment_assign_as_array.yml +39 -0
- data/test/fixtures/vcr/segment_assign_as_strings.yml +39 -0
- data/test/fixtures/vcr/segment_assign_one_array.yml +39 -0
- data/test/fixtures/vcr/segment_assign_one_string.yml +39 -0
- data/test/fixtures/vcr/segment_create.yml +40 -0
- data/test/fixtures/vcr/segment_delete.yml +39 -0
- data/test/fixtures/vcr/segment_detach_as_array.yml +39 -0
- data/test/fixtures/vcr/segment_detach_as_strings.yml +39 -0
- data/test/fixtures/vcr/segment_detach_one_array.yml +39 -0
- data/test/fixtures/vcr/segment_detach_one_string.yml +39 -0
- data/test/fixtures/vcr/segment_find.yml +39 -0
- data/test/fixtures/vcr/segment_update.yml +39 -0
- data/test/fixtures/vcr/visit_all.yml +89 -0
- data/test/fixtures/visit.json +3 -0
- data/test/helpers/all.rb +18 -0
- data/test/helpers/no_create.rb +20 -0
- data/test/helpers/no_delete.rb +20 -0
- data/test/helpers/no_find.rb +20 -0
- data/test/helpers/no_update.rb +20 -0
- data/test/models/campaign_test.rb +37 -0
- data/test/models/contact_test.rb +36 -0
- data/test/models/page_test.rb +11 -0
- data/test/models/referrer_test.rb +25 -0
- data/test/models/segment_test.rb +62 -0
- data/test/models/visit_test.rb +12 -0
- data/test/test_helper.rb +81 -0
- metadata +264 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://stevenbristol%40gmail.com:NqNo3bwWZu@tend.io/api/v1/segments/detach
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: email=stevenbristol%40gmail.com&segments=renamed%20test%20by%20steve%20e31f1b3a-20bd-4605-9844-bab71e230212
|
9
|
+
headers:
|
10
|
+
Accept-Encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- "*/*"
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Date:
|
22
|
+
- Tue, 06 Oct 2015 13:58:26 GMT
|
23
|
+
Server:
|
24
|
+
- Apache
|
25
|
+
Cache-Control:
|
26
|
+
- no-cache
|
27
|
+
Set-Cookie:
|
28
|
+
- laravel_session=eyJpdiI6InU1N0hpYmRPdkk5bjdYWTdBM1l6WkE9PSIsInZhbHVlIjoicmp4N1RCMlJFTEx2bkswdDB6QXJtZlBOK0R0bWZJTCtxaWtjXC8xZ0lEaVZ2dkxWUmxJWlFLcEwrVk5uVDFaN1czZmMxRnp4bDZYN3dSYStrbWhvUmtBPT0iLCJtYWMiOiI3YWQ4YTExMDE5MzU5N2MwODVhNDA3YjBhNmVmNmEwNTJiYjNkMDRkNTg2OGQwZTVlNmIwN2E1NTY1MWY2NTA2In0%3D;
|
29
|
+
expires=Tue, 06-Oct-2015 15:58:26 GMT; Max-Age=7200; path=/; httponly
|
30
|
+
Content-Length:
|
31
|
+
- '58'
|
32
|
+
Content-Type:
|
33
|
+
- application/json
|
34
|
+
body:
|
35
|
+
encoding: UTF-8
|
36
|
+
string: '{"message":"segment removed from stevenbristol@gmail.com"}'
|
37
|
+
http_version:
|
38
|
+
recorded_at: Tue, 06 Oct 2015 13:58:26 GMT
|
39
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,39 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://stevenbristol%40gmail.com:NqNo3bwWZu@tend.io/api/v1/segments/detach
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: email=stevenbristol%40gmail.com&segments=renamed%20test%20by%20steve%20e31f1b3a-20bd-4605-9844-bab71e230212
|
9
|
+
headers:
|
10
|
+
Accept-Encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- "*/*"
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Date:
|
22
|
+
- Tue, 06 Oct 2015 13:58:25 GMT
|
23
|
+
Server:
|
24
|
+
- Apache
|
25
|
+
Cache-Control:
|
26
|
+
- no-cache
|
27
|
+
Set-Cookie:
|
28
|
+
- laravel_session=eyJpdiI6IjMxV3JTRTdDRzR0VlJuNEE2XC9RVEhBPT0iLCJ2YWx1ZSI6ImMwaWJaK0t0ZDJcL2NqRjd3TXl3MklSNzZEYUhWSjZGOWhwdzYyNWZsaWRWeEk3T29RYmVaV0hpckJMSjd6WlVYUXpVMk9kK1h1VGtCUkRZREZcL21Mc1E9PSIsIm1hYyI6IjY1NDg3NjVmZmNlMjk3NzRlOGE2YjE0OWYzNGIyNTFkMWM4MzQ2NTJkZDRkNWEzOGJiZTAwMTY0ZjBiYmM0ZWUifQ%3D%3D;
|
29
|
+
expires=Tue, 06-Oct-2015 15:58:25 GMT; Max-Age=7200; path=/; httponly
|
30
|
+
Content-Length:
|
31
|
+
- '58'
|
32
|
+
Content-Type:
|
33
|
+
- application/json
|
34
|
+
body:
|
35
|
+
encoding: UTF-8
|
36
|
+
string: '{"message":"segment removed from stevenbristol@gmail.com"}'
|
37
|
+
http_version:
|
38
|
+
recorded_at: Tue, 06 Oct 2015 13:58:25 GMT
|
39
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,39 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://stevenbristol%40gmail.com:NqNo3bwWZu@tend.io/api/v1/segments/1
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept-Encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- "*/*"
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Date:
|
22
|
+
- Mon, 05 Oct 2015 19:21:22 GMT
|
23
|
+
Server:
|
24
|
+
- Apache
|
25
|
+
Cache-Control:
|
26
|
+
- no-cache
|
27
|
+
Set-Cookie:
|
28
|
+
- laravel_session=eyJpdiI6IkJRUFBZeHV3dzV2TGxyMmlWRjZaMUE9PSIsInZhbHVlIjoiXC9HUjBIQldiWDEydjFFOHl2QUNNeUFnQUFPdGptR2ZYSmYrZ3dGRFRHRTJNMExtRTRFdGVRVm9CUUVYcm9Fc0ZcL3QrSG1kckozSEpJSUNPOW1DMHlSdz09IiwibWFjIjoiZTAxMzc2MmFhMzZkNzc5MjUwZjVmZDE3ZWRmN2U2NWVjZDZkYTk5MGFhZmFlOTkyNTk2Nzc3ZTJhMTM2M2JkOSJ9;
|
29
|
+
expires=Mon, 05-Oct-2015 21:21:22 GMT; Max-Age=7200; path=/; httponly
|
30
|
+
Content-Length:
|
31
|
+
- '44'
|
32
|
+
Content-Type:
|
33
|
+
- application/json
|
34
|
+
body:
|
35
|
+
encoding: UTF-8
|
36
|
+
string: '{"data":{"id":1,"name":"test by steve 2"}}'
|
37
|
+
http_version:
|
38
|
+
recorded_at: Mon, 05 Oct 2015 19:21:22 GMT
|
39
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,39 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: put
|
5
|
+
uri: https://stevenbristol%40gmail.com:NqNo3bwWZu@tend.io/api/v1/segments/1
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: name=test2
|
9
|
+
headers:
|
10
|
+
Accept-Encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- "*/*"
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Date:
|
22
|
+
- Mon, 05 Oct 2015 19:22:21 GMT
|
23
|
+
Server:
|
24
|
+
- Apache
|
25
|
+
Cache-Control:
|
26
|
+
- no-cache
|
27
|
+
Set-Cookie:
|
28
|
+
- laravel_session=eyJpdiI6ImEzeFpVUFlhdk5Ta0VFXC9PeVNaejBRPT0iLCJ2YWx1ZSI6ImxyZUxCXC9VY3VPXC80SElrSzg2ZWNhOXlGSVI4d1wvN0d3dEdzNk5BSTBcL1lDZVh4eUJUc1NvWWV5SEY1MkdBdVBDRXZxWXhHOGp0Z2dmbzM2d1BxbEdhUT09IiwibWFjIjoiMGYwNDU1OWJlMWE3NTQyN2M1MjQ5ZTM4NDg1MjY4YjRjNzg4OTc2Nzk4MDliNWM0NWYyMDg5NWIxNWRiNTk5NSJ9;
|
29
|
+
expires=Mon, 05-Oct-2015 21:22:21 GMT; Max-Age=7200; path=/; httponly
|
30
|
+
Content-Length:
|
31
|
+
- '75'
|
32
|
+
Content-Type:
|
33
|
+
- application/json
|
34
|
+
body:
|
35
|
+
encoding: UTF-8
|
36
|
+
string: '{"message":"segment successfully updated","data":{"id":1,"name":"test2"}}'
|
37
|
+
http_version:
|
38
|
+
recorded_at: Mon, 05 Oct 2015 19:22:21 GMT
|
39
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,89 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://stevenbristol%40gmail.com:NqNo3bwWZu@tend.io/api/v1/visits?page=1
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept-Encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- "*/*"
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Date:
|
22
|
+
- Mon, 05 Oct 2015 14:33:23 GMT
|
23
|
+
Server:
|
24
|
+
- Apache
|
25
|
+
Cache-Control:
|
26
|
+
- no-cache
|
27
|
+
Set-Cookie:
|
28
|
+
- laravel_session=eyJpdiI6IkVDeXNxQVRHTmtReWFqQWVhSTAxamc9PSIsInZhbHVlIjoiTFE2ektXYUxpekVlTWxWdDM0ck5MYUpJQ1pXMmhCTmQzd2dtdmprOWJYMnEzVTlXeG1WclF2QWFJV1ordFJrNTZRYTdzdlhxZndFbjY3WkN0RmZKckE9PSIsIm1hYyI6Ijk1YTA1MzNmNDU5YTlhNGYwNDdlZTZmZDg0ZDNkYWM3Y2U3MTMxYmM3YjQ0MjhjMGJmZjhjYjdlZjdjNDc4NzUifQ%3D%3D;
|
29
|
+
expires=Mon, 05-Oct-2015 16:33:24 GMT; Max-Age=7200; path=/; httponly
|
30
|
+
Content-Length:
|
31
|
+
- '6420'
|
32
|
+
Content-Type:
|
33
|
+
- application/json
|
34
|
+
body:
|
35
|
+
encoding: UTF-8
|
36
|
+
string: '{"data":[{"id":1,"domain":"lesschurn.dev","page":"\/url","referrer":"direct","campaign":"","date":"2015-07-31
|
37
|
+
11:40:51"},{"id":1,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-07-31
|
38
|
+
11:43:52"},{"id":1,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-07-31
|
39
|
+
11:45:24"},{"id":1,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-07-31
|
40
|
+
11:45:37"},{"id":1,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-07-31
|
41
|
+
11:45:44"},{"id":1,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-07-31
|
42
|
+
11:45:46"},{"id":1,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-07-31
|
43
|
+
11:45:51"},{"id":"1702994","domain":"lesschurn.io","page":"\/url","referrer":"google.co.uk","campaign":"","date":"2015-07-31
|
44
|
+
12:55:48"},{"id":"1703528","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-07-31
|
45
|
+
13:47:18"},{"id":"1704104","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-07-31
|
46
|
+
14:38:31"},{"id":"1704112","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-07-31
|
47
|
+
14:39:18"},{"id":"1703528","domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-07-31
|
48
|
+
14:57:51"},{"id":"1705350","domain":"lesschurn.io","page":"\/url","referrer":"t.co\/Urz9nmofz1","campaign":"","date":"2015-07-31
|
49
|
+
16:32:36"},{"id":"1706533","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-07-31
|
50
|
+
18:57:20"},{"id":"1705350","domain":"lesschurn.io","page":"\/url","referrer":"t.co\/Urz9nmofz1","campaign":"","date":"2015-08-01
|
51
|
+
04:09:20"},{"id":"1710227","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01
|
52
|
+
07:35:55"},{"id":"1705350","domain":"lesschurn.io","page":"\/url","referrer":"t.co\/Urz9nmofz1","campaign":"","date":"2015-08-01
|
53
|
+
08:19:04"},{"id":"1711794","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-01
|
54
|
+
11:34:11"},{"id":"1712583","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01
|
55
|
+
13:20:55"},{"id":"1712583","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01
|
56
|
+
13:21:06"},{"id":"1712761","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-01
|
57
|
+
13:48:08"},{"id":"1712993","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-01
|
58
|
+
14:24:43"},{"id":"1713341","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-01
|
59
|
+
15:33:45"},{"id":"1713511","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01
|
60
|
+
16:03:47"},{"id":"1710227","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01
|
61
|
+
19:07:48"},{"id":"1714585","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01
|
62
|
+
19:29:25"},{"id":"1714585","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01
|
63
|
+
19:29:36"},{"id":"1714901","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-01
|
64
|
+
20:33:15"},{"id":"1714901","domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-08-01
|
65
|
+
20:35:25"},{"id":"1715044","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01
|
66
|
+
21:06:52"},{"id":"1715044","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01
|
67
|
+
21:07:14"},{"id":"1715055","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-01
|
68
|
+
21:08:12"},{"id":"1715044","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01
|
69
|
+
21:09:38"},{"id":"1703528","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-01
|
70
|
+
21:12:43"},{"id":"1715970","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-02
|
71
|
+
00:30:17"},{"id":"1717935","domain":"lesschurn.io","page":"\/url","referrer":"producthunt.com\/tech\/lesschurn","campaign":"","date":"2015-08-02
|
72
|
+
09:03:40"},{"id":"1717935","domain":"lesschurn.io","page":"\/url","referrer":"producthunt.com\/tech\/lesschurn","campaign":"","date":"2015-08-02
|
73
|
+
09:03:50"},{"id":"1718273","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-02
|
74
|
+
09:48:23"},{"id":"1718273","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-02
|
75
|
+
09:57:23"},{"id":"1718273","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-02
|
76
|
+
09:57:28"},{"id":"1718861","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-02
|
77
|
+
11:16:37"},{"id":"1718861","domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-08-02
|
78
|
+
11:29:41"},{"id":"1718861","domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-08-02
|
79
|
+
11:31:07"},{"id":"1719001","domain":"lesschurn.io","page":"\/url","referrer":"google.com","campaign":"","date":"2015-08-02
|
80
|
+
11:35:20"},{"id":1,"domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-02
|
81
|
+
13:15:07"},{"id":1,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-08-02
|
82
|
+
13:15:15"},{"id":85328,"domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-02
|
83
|
+
14:49:55"},{"id":85328,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-08-02
|
84
|
+
14:52:05"},{"id":85328,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-08-02
|
85
|
+
14:52:09"},{"id":85328,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-08-02
|
86
|
+
14:52:10"}],"paginator":{"total_count":4068,"total_pages":82,"current_page":1,"limit":50}}'
|
87
|
+
http_version:
|
88
|
+
recorded_at: Mon, 05 Oct 2015 14:33:24 GMT
|
89
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,3 @@
|
|
1
|
+
{
|
2
|
+
"all":[{"id":1,"domain":"lesschurn.dev","page":"\/url","referrer":"direct","campaign":"","date":"2015-07-31 11:40:51"},{"id":1,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-07-31 11:43:52"},{"id":1,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-07-31 11:45:24"},{"id":1,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-07-31 11:45:37"},{"id":1,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-07-31 11:45:44"},{"id":1,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-07-31 11:45:46"},{"id":1,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-07-31 11:45:51"},{"id":"1702994","domain":"lesschurn.io","page":"\/url","referrer":"google.co.uk","campaign":"","date":"2015-07-31 12:55:48"},{"id":"1703528","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-07-31 13:47:18"},{"id":"1704104","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-07-31 14:38:31"},{"id":"1704112","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-07-31 14:39:18"},{"id":"1703528","domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-07-31 14:57:51"},{"id":"1705350","domain":"lesschurn.io","page":"\/url","referrer":"t.co\/Urz9nmofz1","campaign":"","date":"2015-07-31 16:32:36"},{"id":"1706533","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-07-31 18:57:20"},{"id":"1705350","domain":"lesschurn.io","page":"\/url","referrer":"t.co\/Urz9nmofz1","campaign":"","date":"2015-08-01 04:09:20"},{"id":"1710227","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01 07:35:55"},{"id":"1705350","domain":"lesschurn.io","page":"\/url","referrer":"t.co\/Urz9nmofz1","campaign":"","date":"2015-08-01 08:19:04"},{"id":"1711794","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-01 11:34:11"},{"id":"1712583","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01 13:20:55"},{"id":"1712583","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01 13:21:06"},{"id":"1712761","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-01 13:48:08"},{"id":"1712993","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-01 14:24:43"},{"id":"1713341","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-01 15:33:45"},{"id":"1713511","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01 16:03:47"},{"id":"1710227","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01 19:07:48"},{"id":"1714585","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01 19:29:25"},{"id":"1714585","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01 19:29:36"},{"id":"1714901","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-01 20:33:15"},{"id":"1714901","domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-08-01 20:35:25"},{"id":"1715044","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01 21:06:52"},{"id":"1715044","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01 21:07:14"},{"id":"1715055","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-01 21:08:12"},{"id":"1715044","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-01 21:09:38"},{"id":"1703528","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-01 21:12:43"},{"id":"1715970","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-02 00:30:17"},{"id":"1717935","domain":"lesschurn.io","page":"\/url","referrer":"producthunt.com\/tech\/lesschurn","campaign":"","date":"2015-08-02 09:03:40"},{"id":"1717935","domain":"lesschurn.io","page":"\/url","referrer":"producthunt.com\/tech\/lesschurn","campaign":"","date":"2015-08-02 09:03:50"},{"id":"1718273","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-02 09:48:23"},{"id":"1718273","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-02 09:57:23"},{"id":"1718273","domain":"lesschurn.io","page":"\/url","referrer":"stripe.com\/docs\/integrations","campaign":"","date":"2015-08-02 09:57:28"},{"id":"1718861","domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-02 11:16:37"},{"id":"1718861","domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-08-02 11:29:41"},{"id":"1718861","domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-08-02 11:31:07"},{"id":"1719001","domain":"lesschurn.io","page":"\/url","referrer":"google.com","campaign":"","date":"2015-08-02 11:35:20"},{"id":1,"domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-02 13:15:07"},{"id":1,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-08-02 13:15:15"},{"id":85328,"domain":"lesschurn.io","page":"\/url","referrer":"direct","campaign":"","date":"2015-08-02 14:49:55"},{"id":85328,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-08-02 14:52:05"},{"id":85328,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-08-02 14:52:09"},{"id":85328,"domain":"lesschurn.io","page":"\/url","referrer":"","campaign":"","date":"2015-08-02 14:52:10"}]
|
3
|
+
}
|
data/test/helpers/all.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module Test::Helpers::All
|
2
|
+
module ClassMethods
|
3
|
+
|
4
|
+
end
|
5
|
+
|
6
|
+
module InstanceMethods
|
7
|
+
|
8
|
+
def test_get_all
|
9
|
+
cla = self.class.to_s.gsub("Tend::", "").gsub("Test", "").downcase
|
10
|
+
assert_tend_class cla, "all"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.included(receiver)
|
15
|
+
receiver.extend ClassMethods
|
16
|
+
receiver.send :include, InstanceMethods
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Test::Helpers::NoCreate
|
2
|
+
module ClassMethods
|
3
|
+
|
4
|
+
end
|
5
|
+
|
6
|
+
module InstanceMethods
|
7
|
+
|
8
|
+
def test_no_create
|
9
|
+
cla = "Tend::#{self.class.to_s.gsub("Test", "")}".constantize
|
10
|
+
assert_raises Tend::NotSupportedError do
|
11
|
+
cla.create 1
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.included(receiver)
|
17
|
+
receiver.extend ClassMethods
|
18
|
+
receiver.send :include, InstanceMethods
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Test::Helpers::NoDelete
|
2
|
+
module ClassMethods
|
3
|
+
|
4
|
+
end
|
5
|
+
|
6
|
+
module InstanceMethods
|
7
|
+
|
8
|
+
def test_no_update
|
9
|
+
cla = "Tend::#{self.class.to_s.gsub("Test", "")}".constantize
|
10
|
+
assert_raises Tend::NotSupportedError do
|
11
|
+
cla.new({}).delete
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.included(receiver)
|
17
|
+
receiver.extend ClassMethods
|
18
|
+
receiver.send :include, InstanceMethods
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Test::Helpers::NoFind
|
2
|
+
module ClassMethods
|
3
|
+
|
4
|
+
end
|
5
|
+
|
6
|
+
module InstanceMethods
|
7
|
+
|
8
|
+
def test_no_find
|
9
|
+
cla = "Tend::#{self.class.to_s.gsub("Test", "")}".constantize
|
10
|
+
assert_raises Tend::NotSupportedError do
|
11
|
+
cla.find 1
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.included(receiver)
|
17
|
+
receiver.extend ClassMethods
|
18
|
+
receiver.send :include, InstanceMethods
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Test::Helpers::NoUpdate
|
2
|
+
module ClassMethods
|
3
|
+
|
4
|
+
end
|
5
|
+
|
6
|
+
module InstanceMethods
|
7
|
+
|
8
|
+
def test_no_update
|
9
|
+
cla = "Tend::#{self.class.to_s.gsub("Test", "")}".constantize
|
10
|
+
assert_raises Tend::NotSupportedError do
|
11
|
+
cla.new({}).update 1
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.included(receiver)
|
17
|
+
receiver.extend ClassMethods
|
18
|
+
receiver.send :include, InstanceMethods
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.expand_path('../../../test/test_helper.rb', __FILE__)
|
2
|
+
|
3
|
+
class CampaignTest < Minitest::Test
|
4
|
+
include Test::Helpers::All
|
5
|
+
include Test::Helpers::NoCreate
|
6
|
+
|
7
|
+
|
8
|
+
def test_get_find
|
9
|
+
assert_tend_class "campaign", "find", 1
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_update
|
13
|
+
assert_tend_instance campaign, "update", {name: "test2"}
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_delete
|
17
|
+
assert_tend_instance campaign, "delete"
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_visits
|
21
|
+
assert_tend_instance campaign, "visits"
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_contacts
|
25
|
+
assert_tend_instance campaign, "contacts"
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def campaign
|
30
|
+
s = nil
|
31
|
+
VCR.use_cassette("campaign_find") do
|
32
|
+
s = Tend::Campaign.find 1
|
33
|
+
end
|
34
|
+
s
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.expand_path('../../../test/test_helper.rb', __FILE__)
|
2
|
+
|
3
|
+
class ContactTest < Minitest::Test
|
4
|
+
include Test::Helpers::All
|
5
|
+
include Test::Helpers::NoCreate
|
6
|
+
|
7
|
+
|
8
|
+
def test_get_find
|
9
|
+
assert_tend_class "contact", "find", 1
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_get_visits
|
13
|
+
assert_tend_instance contact, "visits", {reload: true}
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_get_segments
|
17
|
+
assert_tend_instance contact, "segments", {reload: true}
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_update
|
21
|
+
assert_tend_instance contact, "update", {lastName: "Bristoll"}
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_delete
|
25
|
+
assert_tend_instance contact, "delete"
|
26
|
+
end
|
27
|
+
|
28
|
+
def contact
|
29
|
+
c = nil
|
30
|
+
VCR.use_cassette("contact_find") do
|
31
|
+
c = Tend::Contact.find 1
|
32
|
+
end
|
33
|
+
c
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.expand_path('../../../test/test_helper.rb', __FILE__)
|
2
|
+
|
3
|
+
class PageTest < Minitest::Test
|
4
|
+
include Test::Helpers::All
|
5
|
+
include Test::Helpers::NoFind
|
6
|
+
include Test::Helpers::NoCreate
|
7
|
+
include Test::Helpers::NoUpdate
|
8
|
+
include Test::Helpers::NoDelete
|
9
|
+
|
10
|
+
|
11
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.expand_path('../../../test/test_helper.rb', __FILE__)
|
2
|
+
|
3
|
+
class ReferrerTest < Minitest::Test
|
4
|
+
include Test::Helpers::All
|
5
|
+
include Test::Helpers::NoCreate
|
6
|
+
include Test::Helpers::NoUpdate
|
7
|
+
include Test::Helpers::NoDelete
|
8
|
+
|
9
|
+
def test_get_find
|
10
|
+
assert_tend_class "referrer", "find", 1
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_visits
|
14
|
+
r = nil
|
15
|
+
VCR.use_cassette("referrer_find") { r = Tend::Referrer.find 1}
|
16
|
+
assert_tend_instance r, "visits"
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_contacts
|
20
|
+
r = nil
|
21
|
+
VCR.use_cassette("referrer_find") { r = Tend::Referrer.find 1}
|
22
|
+
assert_tend_instance r, "contacts"
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require File.expand_path('../../../test/test_helper.rb', __FILE__)
|
2
|
+
|
3
|
+
class SegmentTest < Minitest::Test
|
4
|
+
include Test::Helpers::All
|
5
|
+
|
6
|
+
def test_create
|
7
|
+
assert_tend_class "segment", "create", {name: "test by steve 2"}
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_get_find
|
11
|
+
assert_tend_class "segment", "find", 1
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_update
|
15
|
+
assert_tend_instance segment, "update", {name: "test2"}
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_delete
|
19
|
+
assert_tend_instance segment, "delete"
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_assign_one_string
|
23
|
+
assert_tend_class "segment", "assign|one_string", "stevenbristol@gmail.com", "renamed test by steve e31f1b3a-20bd-4605-9844-bab71e230212"
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_assign_as_strings
|
27
|
+
assert_tend_class "segment", "assign|as_strings", "stevenbristol@gmail.com", "renamed test by steve e31f1b3a-20bd-4605-9844-bab71e230212,renamed test by steve 96f63274-9dc3-407a-98a0-21d54bd3f590"
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_assign_one_array
|
31
|
+
assert_tend_class "segment", "assign|one_array", "stevenbristol@gmail.com", ["renamed test by steve e31f1b3a-20bd-4605-9844-bab71e230212"]
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_assign_as_array
|
35
|
+
assert_tend_class "segment", "assign|as_array", "stevenbristol@gmail.com", ["renamed test by steve e31f1b3a-20bd-4605-9844-bab71e230212","renamed test by steve 96f63274-9dc3-407a-98a0-21d54bd3f590"]
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_detach_one_string
|
39
|
+
assert_tend_class "segment", "detach|one_string", "stevenbristol@gmail.com", "renamed test by steve e31f1b3a-20bd-4605-9844-bab71e230212"
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_detach_as_strings
|
43
|
+
assert_tend_class "segment", "detach|as_strings", "stevenbristol@gmail.com", "renamed test by steve e31f1b3a-20bd-4605-9844-bab71e230212,renamed test by steve 96f63274-9dc3-407a-98a0-21d54bd3f590"
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_detach_one_array
|
47
|
+
assert_tend_class "segment", "detach|one_array", "stevenbristol@gmail.com", ["renamed test by steve e31f1b3a-20bd-4605-9844-bab71e230212"]
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_detach_as_array
|
51
|
+
assert_tend_class "segment", "detach|as_array", "stevenbristol@gmail.com", ["renamed test by steve e31f1b3a-20bd-4605-9844-bab71e230212","renamed test by steve 96f63274-9dc3-407a-98a0-21d54bd3f590"]
|
52
|
+
end
|
53
|
+
|
54
|
+
def segment
|
55
|
+
s = nil
|
56
|
+
VCR.use_cassette("segment_find") do
|
57
|
+
s = Tend::Segment.find 1
|
58
|
+
end
|
59
|
+
s
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.expand_path('../../../test/test_helper.rb', __FILE__)
|
2
|
+
|
3
|
+
class VisitTest < Minitest::Test
|
4
|
+
include Test::Helpers::All
|
5
|
+
include Test::Helpers::NoFind
|
6
|
+
include Test::Helpers::NoCreate
|
7
|
+
include Test::Helpers::NoUpdate
|
8
|
+
include Test::Helpers::NoDelete
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
|
3
|
+
require 'minitest/autorun'
|
4
|
+
require 'minitest/pride'
|
5
|
+
require "vcr"
|
6
|
+
|
7
|
+
module Test;end
|
8
|
+
module Test::Helpers;end
|
9
|
+
|
10
|
+
require "tend"
|
11
|
+
require "helpers/all"
|
12
|
+
require "helpers/no_find"
|
13
|
+
require "helpers/no_create"
|
14
|
+
require "helpers/no_update"
|
15
|
+
require "helpers/no_delete"
|
16
|
+
|
17
|
+
Tend.user_name = "stevenbristol@gmail.com"
|
18
|
+
Tend.password = "NqNo3bwWZu"
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
VCR.configure do |config|
|
23
|
+
config.cassette_library_dir = "test/fixtures/vcr"
|
24
|
+
config.hook_into :webmock # or :fakeweb
|
25
|
+
end
|
26
|
+
|
27
|
+
def fixture file_name, key
|
28
|
+
json = File.read( "test/fixtures/#{file_name}.json" )
|
29
|
+
JSON.parse( json )[key]
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def assert_tend_class class_name, meth, *args
|
34
|
+
cla = "Tend::#{class_name.titleize}".constantize
|
35
|
+
x = meth.split "|"
|
36
|
+
m = x.first
|
37
|
+
key = x.first == x.last ? "#{m}" : "#{m}_#{x.last}"
|
38
|
+
file_name = "#{class_name}_#{key}"
|
39
|
+
VCR.use_cassette(file_name) do
|
40
|
+
fix = fixture(class_name, key)
|
41
|
+
tend = args.empty? ? cla.send(m) : cla.send(m, *args)
|
42
|
+
if fix.is_a? Array
|
43
|
+
assert_equal fix.size, tend.size, "The array returned by Tend is not the same size as the fixture array."
|
44
|
+
fix.each_with_index do |f, index|
|
45
|
+
assert_tend_object f, tend[index]
|
46
|
+
end
|
47
|
+
else
|
48
|
+
assert_tend_object fix, tend
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def assert_tend_instance instance, meth, *args
|
54
|
+
class_name = instance.class.to_s.gsub("Tend::", "").downcase
|
55
|
+
VCR.use_cassette("#{class_name}_#{meth}") do
|
56
|
+
fix = fixture(class_name, meth)
|
57
|
+
tend = args.empty? ? instance.send(meth) : instance.send(meth, *args)
|
58
|
+
if fix.is_a? Array
|
59
|
+
assert_equal fix.size, tend.size, "The array returned by Tend is not the same size as the fixture array."
|
60
|
+
fix.each_with_index do |f, index|
|
61
|
+
assert_tend_object f, tend[index]
|
62
|
+
end
|
63
|
+
else
|
64
|
+
assert_tend_object fix, tend
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def assert_tend_object fixture, tend
|
70
|
+
if fixture['message']
|
71
|
+
assert_equal fixture["message"], tend
|
72
|
+
else
|
73
|
+
fixture.each do |k, v|
|
74
|
+
assert_equal v, tend.send(k), "Attribute #{k} does not match"
|
75
|
+
end
|
76
|
+
assert_equal fixture, tend.attributes, "Attributes do not match"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
|