notion-ruby-client 0.0.1 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +14 -0
  3. data/.rspec +2 -0
  4. data/.rspec_status +18 -0
  5. data/.rubocop.yml +46 -0
  6. data/.rubocop_todo.yml +86 -0
  7. data/CHANGELOG.md +26 -0
  8. data/CODE_OF_CONDUCT.md +128 -0
  9. data/Gemfile.lock +95 -0
  10. data/README.md +192 -3
  11. data/Rakefile +18 -0
  12. data/lib/notion-ruby-client.rb +6 -8
  13. data/lib/notion/api/endpoints.rb +6 -0
  14. data/lib/notion/api/endpoints/blocks.rb +53 -0
  15. data/lib/notion/api/endpoints/databases.rb +78 -0
  16. data/lib/notion/api/endpoints/pages.rb +69 -0
  17. data/lib/notion/api/endpoints/users.rb +7 -3
  18. data/lib/notion/api/errors.rb +7 -1
  19. data/lib/notion/api/errors/notion_error.rb +2 -2
  20. data/lib/notion/config.rb +3 -1
  21. data/lib/notion/faraday/request.rb +8 -2
  22. data/lib/notion/faraday/response/raise_error.rb +3 -4
  23. data/lib/notion/pagination/cursor.rb +2 -2
  24. data/lib/notion/version.rb +3 -2
  25. data/notion-ruby-client-0.0.4.gem +0 -0
  26. data/spec/fixtures/notion/block_append_children.yml +135 -0
  27. data/spec/fixtures/notion/block_children.yml +137 -0
  28. data/spec/fixtures/notion/create_page.yml +137 -0
  29. data/spec/fixtures/notion/database.yml +133 -0
  30. data/spec/fixtures/notion/database_query.yml +135 -0
  31. data/spec/fixtures/notion/databases_list.yml +133 -0
  32. data/spec/fixtures/notion/page.yml +133 -0
  33. data/spec/fixtures/notion/paginated_block_children.yml +521 -0
  34. data/spec/fixtures/notion/paginated_database_query.yml +135 -0
  35. data/spec/fixtures/notion/paginated_databases_list.yml +133 -0
  36. data/spec/fixtures/notion/paginated_users_list.yml +133 -0
  37. data/spec/fixtures/notion/update_page.yml +136 -0
  38. data/spec/fixtures/notion/users.yml +132 -0
  39. data/spec/fixtures/notion/users_list.yml +133 -0
  40. data/spec/notion/api/endpoints/blocks_spec.rb +40 -0
  41. data/spec/notion/api/endpoints/databases_spec.rb +40 -0
  42. data/spec/notion/api/endpoints/pages_spec.rb +64 -0
  43. data/spec/notion/api/endpoints/users_spec.rb +26 -0
  44. data/spec/notion/config_spec.rb +16 -0
  45. data/spec/notion/version_spec.rb +8 -0
  46. data/spec/spec_helper.rb +22 -0
  47. data/spec/support/token.rb +10 -0
  48. data/spec/support/vcr.rb +16 -0
  49. metadata +67 -8
@@ -0,0 +1,132 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.notion.com/v1/users/a8da8d30-c858-4c3d-87ad-3f2d477bd98d
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - application/json; charset=utf-8
12
+ User-Agent:
13
+ - Notion Ruby Client/0.0.4
14
+ Authorization:
15
+ - Bearer <NOTION_API_TOKEN>
16
+ Accept-Encoding:
17
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: OK
22
+ headers:
23
+ Date:
24
+ - Sun, 25 Apr 2021 21:00:08 GMT
25
+ Content-Type:
26
+ - application/json; charset=utf-8
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - keep-alive
31
+ Set-Cookie:
32
+ - __cfduid=d10c7505ad45dea19d885ea9e087883651619384407; expires=Tue, 25-May-21
33
+ 21:00:07 GMT; path=/; domain=.notion.com; HttpOnly; SameSite=Lax
34
+ - notion_browser_id=6378e6be-b1ca-4d94-b556-8f3ae50d725f; Domain=www.notion.so;
35
+ Path=/; Expires=Wed, 01 Jan 2053 22:46:48 GMT; Secure
36
+ X-Dns-Prefetch-Control:
37
+ - 'off'
38
+ X-Frame-Options:
39
+ - SAMEORIGIN
40
+ Strict-Transport-Security:
41
+ - max-age=5184000; includeSubDomains
42
+ X-Download-Options:
43
+ - noopen
44
+ X-Content-Type-Options:
45
+ - nosniff
46
+ X-Xss-Protection:
47
+ - 1; mode=block
48
+ Referrer-Policy:
49
+ - same-origin
50
+ Content-Security-Policy:
51
+ - 'script-src ''self'' ''unsafe-inline'' ''unsafe-eval'' https://gist.github.com
52
+ https://apis.google.com https://api.amplitude.com https://widget.intercom.io
53
+ https://js.intercomcdn.com https://logs-01.loggly.com https://cdn.segment.com
54
+ https://analytics.pgncs.notion.so https://checkout.stripe.com https://js.stripe.com/v3
55
+ https://embed.typeform.com https://admin.typeform.com https://platform.twitter.com
56
+ https://cdn.syndication.twimg.com https://www.googletagmanager.com https://x.clearbitjs.com;
57
+ connect-src ''self'' https://msgstore.www.notion.so wss://msgstore.www.notion.so
58
+ ws://localhost:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com
59
+ https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com
60
+ https: http: https://api.amplitude.com https://api.embed.ly https://js.intercomcdn.com
61
+ https://api-iam.intercom.io wss://nexus-websocket-a.intercom.io https://logs-01.loggly.com
62
+ https://api.segment.io https://api.pgncs.notion.so https://checkout.stripe.com
63
+ https://js.stripe.com/v3 https://cdn.contentful.com https://preview.contentful.com
64
+ https://images.ctfassets.net https://api.unsplash.com https://boards-api.greenhouse.io;
65
+ font-src ''self'' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com;
66
+ img-src ''self'' data: blob: https: https://platform.twitter.com https://syndication.twitter.com
67
+ https://pbs.twimg.com https://ton.twimg.com www.googletagmanager.com; style-src
68
+ ''self'' ''unsafe-inline'' https://cdnjs.cloudflare.com https://github.githubassets.com
69
+ https://platform.twitter.com https://ton.twimg.com; frame-src https: http:;
70
+ media-src https: http:'
71
+ X-Content-Security-Policy:
72
+ - 'script-src ''self'' ''unsafe-inline'' ''unsafe-eval'' https://gist.github.com
73
+ https://apis.google.com https://api.amplitude.com https://widget.intercom.io
74
+ https://js.intercomcdn.com https://logs-01.loggly.com https://cdn.segment.com
75
+ https://analytics.pgncs.notion.so https://checkout.stripe.com https://js.stripe.com/v3
76
+ https://embed.typeform.com https://admin.typeform.com https://platform.twitter.com
77
+ https://cdn.syndication.twimg.com https://www.googletagmanager.com https://x.clearbitjs.com;
78
+ connect-src ''self'' https://msgstore.www.notion.so wss://msgstore.www.notion.so
79
+ ws://localhost:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com
80
+ https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com
81
+ https: http: https://api.amplitude.com https://api.embed.ly https://js.intercomcdn.com
82
+ https://api-iam.intercom.io wss://nexus-websocket-a.intercom.io https://logs-01.loggly.com
83
+ https://api.segment.io https://api.pgncs.notion.so https://checkout.stripe.com
84
+ https://js.stripe.com/v3 https://cdn.contentful.com https://preview.contentful.com
85
+ https://images.ctfassets.net https://api.unsplash.com https://boards-api.greenhouse.io;
86
+ font-src ''self'' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com;
87
+ img-src ''self'' data: blob: https: https://platform.twitter.com https://syndication.twitter.com
88
+ https://pbs.twimg.com https://ton.twimg.com www.googletagmanager.com; style-src
89
+ ''self'' ''unsafe-inline'' https://cdnjs.cloudflare.com https://github.githubassets.com
90
+ https://platform.twitter.com https://ton.twimg.com; frame-src https: http:;
91
+ media-src https: http:'
92
+ X-Webkit-Csp:
93
+ - 'script-src ''self'' ''unsafe-inline'' ''unsafe-eval'' https://gist.github.com
94
+ https://apis.google.com https://api.amplitude.com https://widget.intercom.io
95
+ https://js.intercomcdn.com https://logs-01.loggly.com https://cdn.segment.com
96
+ https://analytics.pgncs.notion.so https://checkout.stripe.com https://js.stripe.com/v3
97
+ https://embed.typeform.com https://admin.typeform.com https://platform.twitter.com
98
+ https://cdn.syndication.twimg.com https://www.googletagmanager.com https://x.clearbitjs.com;
99
+ connect-src ''self'' https://msgstore.www.notion.so wss://msgstore.www.notion.so
100
+ ws://localhost:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com
101
+ https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com
102
+ https: http: https://api.amplitude.com https://api.embed.ly https://js.intercomcdn.com
103
+ https://api-iam.intercom.io wss://nexus-websocket-a.intercom.io https://logs-01.loggly.com
104
+ https://api.segment.io https://api.pgncs.notion.so https://checkout.stripe.com
105
+ https://js.stripe.com/v3 https://cdn.contentful.com https://preview.contentful.com
106
+ https://images.ctfassets.net https://api.unsplash.com https://boards-api.greenhouse.io;
107
+ font-src ''self'' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com;
108
+ img-src ''self'' data: blob: https: https://platform.twitter.com https://syndication.twitter.com
109
+ https://pbs.twimg.com https://ton.twimg.com www.googletagmanager.com; style-src
110
+ ''self'' ''unsafe-inline'' https://cdnjs.cloudflare.com https://github.githubassets.com
111
+ https://platform.twitter.com https://ton.twimg.com; frame-src https: http:;
112
+ media-src https: http:'
113
+ Etag:
114
+ - W/"112-+UfaDnQ0AQtnGmMk1mvOOgv2xyk"
115
+ Vary:
116
+ - Accept-Encoding
117
+ Cf-Cache-Status:
118
+ - DYNAMIC
119
+ Cf-Request-Id:
120
+ - '09ac6e2e810000a843f7864000000001'
121
+ Expect-Ct:
122
+ - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
123
+ Server:
124
+ - cloudflare
125
+ Cf-Ray:
126
+ - 645a7fc3fe50a843-CDG
127
+ body:
128
+ encoding: UTF-8
129
+ string: '{"object":"user","id":"a8da8d30-c858-4c3d-87ad-3f2d477bd98d","name":"Nicolas
130
+ Goutay","avatar_url":"https://s3-us-west-2.amazonaws.com/public.notion-static.com/5f9b5c65-a7ed-4fc5-983a-6c999b7c2208/Copy_of_P1222454.jpg","type":"person","person":{"email":"nicolas@orbit.love"}}'
131
+ recorded_at: Sun, 25 Apr 2021 21:00:08 GMT
132
+ recorded_with: VCR 6.0.0
@@ -0,0 +1,133 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.notion.com/v1/users
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - application/json; charset=utf-8
12
+ User-Agent:
13
+ - Notion Ruby Client/0.0.4
14
+ Authorization:
15
+ - Bearer <NOTION_API_TOKEN>
16
+ Accept-Encoding:
17
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: OK
22
+ headers:
23
+ Date:
24
+ - Sun, 25 Apr 2021 21:00:06 GMT
25
+ Content-Type:
26
+ - application/json; charset=utf-8
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - keep-alive
31
+ Set-Cookie:
32
+ - __cfduid=d8bd1f2559197f7cbe522dc8d2a13cf771619384405; expires=Tue, 25-May-21
33
+ 21:00:05 GMT; path=/; domain=.notion.com; HttpOnly; SameSite=Lax
34
+ - notion_browser_id=a30325ff-c789-4096-a739-ba51b79eea5b; Domain=www.notion.so;
35
+ Path=/; Expires=Wed, 01 Jan 2053 22:46:46 GMT; Secure
36
+ X-Dns-Prefetch-Control:
37
+ - 'off'
38
+ X-Frame-Options:
39
+ - SAMEORIGIN
40
+ Strict-Transport-Security:
41
+ - max-age=5184000; includeSubDomains
42
+ X-Download-Options:
43
+ - noopen
44
+ X-Content-Type-Options:
45
+ - nosniff
46
+ X-Xss-Protection:
47
+ - 1; mode=block
48
+ Referrer-Policy:
49
+ - same-origin
50
+ Content-Security-Policy:
51
+ - 'script-src ''self'' ''unsafe-inline'' ''unsafe-eval'' https://gist.github.com
52
+ https://apis.google.com https://api.amplitude.com https://widget.intercom.io
53
+ https://js.intercomcdn.com https://logs-01.loggly.com https://cdn.segment.com
54
+ https://analytics.pgncs.notion.so https://checkout.stripe.com https://js.stripe.com/v3
55
+ https://embed.typeform.com https://admin.typeform.com https://platform.twitter.com
56
+ https://cdn.syndication.twimg.com https://www.googletagmanager.com https://x.clearbitjs.com;
57
+ connect-src ''self'' https://msgstore.www.notion.so wss://msgstore.www.notion.so
58
+ ws://localhost:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com
59
+ https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com
60
+ https: http: https://api.amplitude.com https://api.embed.ly https://js.intercomcdn.com
61
+ https://api-iam.intercom.io wss://nexus-websocket-a.intercom.io https://logs-01.loggly.com
62
+ https://api.segment.io https://api.pgncs.notion.so https://checkout.stripe.com
63
+ https://js.stripe.com/v3 https://cdn.contentful.com https://preview.contentful.com
64
+ https://images.ctfassets.net https://api.unsplash.com https://boards-api.greenhouse.io;
65
+ font-src ''self'' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com;
66
+ img-src ''self'' data: blob: https: https://platform.twitter.com https://syndication.twitter.com
67
+ https://pbs.twimg.com https://ton.twimg.com www.googletagmanager.com; style-src
68
+ ''self'' ''unsafe-inline'' https://cdnjs.cloudflare.com https://github.githubassets.com
69
+ https://platform.twitter.com https://ton.twimg.com; frame-src https: http:;
70
+ media-src https: http:'
71
+ X-Content-Security-Policy:
72
+ - 'script-src ''self'' ''unsafe-inline'' ''unsafe-eval'' https://gist.github.com
73
+ https://apis.google.com https://api.amplitude.com https://widget.intercom.io
74
+ https://js.intercomcdn.com https://logs-01.loggly.com https://cdn.segment.com
75
+ https://analytics.pgncs.notion.so https://checkout.stripe.com https://js.stripe.com/v3
76
+ https://embed.typeform.com https://admin.typeform.com https://platform.twitter.com
77
+ https://cdn.syndication.twimg.com https://www.googletagmanager.com https://x.clearbitjs.com;
78
+ connect-src ''self'' https://msgstore.www.notion.so wss://msgstore.www.notion.so
79
+ ws://localhost:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com
80
+ https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com
81
+ https: http: https://api.amplitude.com https://api.embed.ly https://js.intercomcdn.com
82
+ https://api-iam.intercom.io wss://nexus-websocket-a.intercom.io https://logs-01.loggly.com
83
+ https://api.segment.io https://api.pgncs.notion.so https://checkout.stripe.com
84
+ https://js.stripe.com/v3 https://cdn.contentful.com https://preview.contentful.com
85
+ https://images.ctfassets.net https://api.unsplash.com https://boards-api.greenhouse.io;
86
+ font-src ''self'' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com;
87
+ img-src ''self'' data: blob: https: https://platform.twitter.com https://syndication.twitter.com
88
+ https://pbs.twimg.com https://ton.twimg.com www.googletagmanager.com; style-src
89
+ ''self'' ''unsafe-inline'' https://cdnjs.cloudflare.com https://github.githubassets.com
90
+ https://platform.twitter.com https://ton.twimg.com; frame-src https: http:;
91
+ media-src https: http:'
92
+ X-Webkit-Csp:
93
+ - 'script-src ''self'' ''unsafe-inline'' ''unsafe-eval'' https://gist.github.com
94
+ https://apis.google.com https://api.amplitude.com https://widget.intercom.io
95
+ https://js.intercomcdn.com https://logs-01.loggly.com https://cdn.segment.com
96
+ https://analytics.pgncs.notion.so https://checkout.stripe.com https://js.stripe.com/v3
97
+ https://embed.typeform.com https://admin.typeform.com https://platform.twitter.com
98
+ https://cdn.syndication.twimg.com https://www.googletagmanager.com https://x.clearbitjs.com;
99
+ connect-src ''self'' https://msgstore.www.notion.so wss://msgstore.www.notion.so
100
+ ws://localhost:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com
101
+ https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com
102
+ https: http: https://api.amplitude.com https://api.embed.ly https://js.intercomcdn.com
103
+ https://api-iam.intercom.io wss://nexus-websocket-a.intercom.io https://logs-01.loggly.com
104
+ https://api.segment.io https://api.pgncs.notion.so https://checkout.stripe.com
105
+ https://js.stripe.com/v3 https://cdn.contentful.com https://preview.contentful.com
106
+ https://images.ctfassets.net https://api.unsplash.com https://boards-api.greenhouse.io;
107
+ font-src ''self'' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com;
108
+ img-src ''self'' data: blob: https: https://platform.twitter.com https://syndication.twitter.com
109
+ https://pbs.twimg.com https://ton.twimg.com www.googletagmanager.com; style-src
110
+ ''self'' ''unsafe-inline'' https://cdnjs.cloudflare.com https://github.githubassets.com
111
+ https://platform.twitter.com https://ton.twimg.com; frame-src https: http:;
112
+ media-src https: http:'
113
+ Etag:
114
+ - W/"2c7-9fGZ6Loa3izncqaW0AxZr7NvCPY"
115
+ Vary:
116
+ - Accept-Encoding
117
+ Cf-Cache-Status:
118
+ - DYNAMIC
119
+ Cf-Request-Id:
120
+ - '09ac6e27c800000853aea0c000000001'
121
+ Expect-Ct:
122
+ - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
123
+ Server:
124
+ - cloudflare
125
+ Cf-Ray:
126
+ - 645a7fb93dac0853-CDG
127
+ body:
128
+ encoding: UTF-8
129
+ string: '{"object":"list","results":[{"object":"user","id":"7ee614aa-0542-421d-b8aa-b14adf120642","name":"Arthur
130
+ Levoyer","avatar_url":"https://lh6.googleusercontent.com/-Y62UK1QjtV8/AAAAAAAAAAI/AAAAAAAAACk/3PgWyczXM8o/photo.jpg?sz=50","type":"person","person":{"email":"arthurl@bam.tech"}},{"object":"user","id":"a8da8d30-c858-4c3d-87ad-3f2d477bd98d","name":"Nicolas
131
+ Goutay","avatar_url":"https://s3-us-west-2.amazonaws.com/public.notion-static.com/5f9b5c65-a7ed-4fc5-983a-6c999b7c2208/Copy_of_P1222454.jpg","type":"person","person":{"email":"nicolas@orbit.love"}},{"object":"user","id":"f2e67536-c037-4dd5-97f5-8ed9d23a4dbd","name":"LeBot","avatar_url":null,"type":"bot","bot":{}}],"next_cursor":null,"has_more":false}'
132
+ recorded_at: Sun, 25 Apr 2021 21:00:06 GMT
133
+ recorded_with: VCR 6.0.0
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe Notion::Api::Endpoints::Blocks do
5
+ let(:client) { Notion::Client.new }
6
+ let(:page_id) { '723578f1-6e51-450c-8ee1-09158c19fd4c' }
7
+ let(:children) do
8
+ [
9
+ {
10
+ "object": 'block',
11
+ "type": 'heading_2',
12
+ "heading_2": {
13
+ "text": [{ "type": 'text', "text": { "content": 'Another Heading' } }]
14
+ }
15
+ }
16
+ ]
17
+ end
18
+
19
+ context 'blocks' do
20
+ it 'children', vcr: { cassette_name: 'block_children' } do
21
+ response = client.block_children(id: page_id)
22
+ expect(response.results.length).to be >= 1
23
+ expect(response.results[0].heading_1.text.first.plain_text).to eql 'A Header'
24
+ expect(response.results[1].paragraph.text.first.plain_text).to eql 'A paragraph'
25
+ end
26
+
27
+ it 'paginated children', vcr: { cassette_name: 'paginated_block_children' } do
28
+ children = []
29
+ client.block_children(id: page_id, page_size: 1) do |page|
30
+ children.concat page.results
31
+ end
32
+ expect(children.size).to be >= 1
33
+ end
34
+
35
+ it 'appends', vcr: { cassette_name: 'block_append_children' } do
36
+ response = client.block_append_children(id: page_id, children: children)
37
+ expect(response.id).to eql page_id
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe Notion::Api::Endpoints::Databases do
5
+ let(:client) { Notion::Client.new }
6
+ let(:database_id) { '89b30a70-ce51-4646-ab4f-5fdcb1d5e76c' }
7
+
8
+ context 'databases' do
9
+ it 'retrieves', vcr: { cassette_name: 'database' } do
10
+ response = client.database(id: database_id)
11
+ expect(response.title.first.plain_text).to eql 'A Notion database'
12
+ end
13
+
14
+ it 'queries', vcr: { cassette_name: 'database_query' } do
15
+ response = client.database_query(id: database_id)
16
+ expect(response.results.length).to be >= 1
17
+ end
18
+
19
+ it 'paginated queries', vcr: { cassette_name: 'paginated_database_query' } do
20
+ pages = []
21
+ client.database_query(id: database_id, limit: 1) do |page|
22
+ pages.concat page.results
23
+ end
24
+ expect(pages.size).to be >= 1
25
+ end
26
+
27
+ it 'lists', vcr: { cassette_name: 'databases_list' } do
28
+ response = client.databases_list
29
+ expect(response.results.length).to be >= 1
30
+ end
31
+
32
+ it 'paginated lists', vcr: { cassette_name: 'paginated_databases_list' } do
33
+ databases = []
34
+ client.databases_list(limit: 1) do |page|
35
+ databases.concat page.results
36
+ end
37
+ expect(databases.size).to be >= 1
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe Notion::Api::Endpoints::Pages do
5
+ let(:client) { Notion::Client.new }
6
+ let(:database_id) { '89b30a70-ce51-4646-ab4f-5fdcb1d5e76c' }
7
+ let(:page_id) { '723578f1-6e51-450c-8ee1-09158c19fd4c' }
8
+ let(:properties) do
9
+ {
10
+ "Name": [
11
+ {
12
+ "text": {
13
+ "content": 'Another Notion page'
14
+ }
15
+ }
16
+ ]
17
+ }
18
+ end
19
+ let(:children) do
20
+ [
21
+ {
22
+ "object": 'block',
23
+ "type": 'heading_2',
24
+ "heading_2": {
25
+ "text": [{ "type": 'text', "text": { "content": 'A heading' } }]
26
+ }
27
+ }
28
+ ]
29
+ end
30
+
31
+ context 'pages' do
32
+ it 'retrieves', vcr: { cassette_name: 'page' } do
33
+ response = client.page(id: page_id)
34
+ expect(response.properties.Name.type).to eql 'title'
35
+ expect(response.properties.Name.title.first.plain_text).to eql 'A Notion page'
36
+ end
37
+
38
+ it 'creates', vcr: { cassette_name: 'create_page' } do
39
+ response = client.create_page(
40
+ parent: { database_id: database_id },
41
+ properties: properties,
42
+ children: children
43
+ )
44
+ expect(response.properties.Name.title.first.plain_text).to eql 'Another Notion page'
45
+ end
46
+
47
+ it 'updates', vcr: { cassette_name: 'update_page' } do
48
+ properties = {
49
+ "Name": [
50
+ {
51
+ "text": {
52
+ "content": 'A Notion page'
53
+ }
54
+ }
55
+ ]
56
+ }
57
+ response = client.update_page(
58
+ id: page_id,
59
+ properties: properties
60
+ )
61
+ expect(response.properties.Name.title.first.plain_text).to eql 'A Notion page'
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe Notion::Api::Endpoints::Users do
5
+ let(:client) { Notion::Client.new }
6
+
7
+ context 'users' do
8
+ it 'lists', vcr: { cassette_name: 'users_list' } do
9
+ response = client.users_list
10
+ expect(response.results.size).to be 3
11
+ end
12
+
13
+ it 'paginated list', vcr: { cassette_name: 'paginated_users_list' } do
14
+ members = []
15
+ client.users_list(limit: 2) do |page|
16
+ members.concat page.results
17
+ end
18
+ expect(members.size).to eq 3
19
+ end
20
+
21
+ it 'retrieves', vcr: { cassette_name: 'users' } do
22
+ response = client.user(id: 'a8da8d30-c858-4c3d-87ad-3f2d477bd98d')
23
+ expect(response.name).to eql 'Nicolas Goutay'
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ describe Notion::Config do
5
+ describe '#configure' do
6
+ before do
7
+ Notion.configure do |config|
8
+ config.token = 'a token'
9
+ end
10
+ end
11
+
12
+ it 'sets token' do
13
+ expect(Notion.config.token).to eq 'a token'
14
+ end
15
+ end
16
+ end