github-community-projects / github-community-projects/graphql-client

Automatic parsing of `ISO8601Date` and other custom types

Open
#17 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
Ruby
Stars
78
Forks
228
PR merge metrics
No merged PRs in 30d

Description

We use graphql-ruby and graphql-client to talk to each other. The `graphql-ruby` library defines a few extra types beyond the standard GraphQL types, e.g. `ISO8601Date`, `ISO8601DateTime`, etc, which we make use of.

In the client we've found that the values of these fields are not getting automatically cast back to `Date` / `Time` objects, like they do for other types of object.

I was wondering what might be the best way to get automatic casting for these types. At the moment the only way I can see it might work is by monkey-patching the `GraphQL::Schema::BUILT_IN_TYPES` hash, which is a bit 🤢 .

```ruby
module GraphQL
class Schema
BUILT_IN_TYPES['ISO8601Date'] = GraphQL::Types::ISO8601Date
BUILT_IN_TYPES['ISO8601DateTime'] = GraphQL::Types::ISO8601DateTime
end
end
```

Is there a better way of managing this? I can imagine that other GraphQL schemas might have other sorts of custom types, but then how should they be re-interpreted by the client?

Incidentally the tests don't tickle this situation, as the schema is defined using the DSL. To get the datetime/date parsing tests to fail, change [test/test_query_result.rb](https://github.com/github-community-projects/graphql-client/blob/master/test/test_query_result.rb#L219) to dump/reload the schema:

```ruby
ReloadedSchema = GraphQL::Client.load_schema(Schema.execute(GraphQL::Introspection.query(include_deprecated_args: true, include_schema_description: true, include_specified_by_url: true, include_is_repeatable: true)))

def setup
@client = GraphQL::Client.new(schema: ReloadedSchema, execute: Schema, enforce_collocated_callers: true)
end
```

Then the test fails:

```
bundle exec rake test TEST=test/test_query_result.rb
Run options: --seed 9819

# Running:

F.........F.......F...................

Finished in 0.077330s, 491.4005 runs/s, 1551.7910 assertions/s.

1) Failure:
TestQueryResult#test_interface_within_union_values [test/test_query_result.rb:592]:
Expected: 1970-01-01 00:00:01 UTC
Actual: "1970-01-01T01:00:01+01:00"

2) Failure:
TestQueryResult#test_date_scalar_casting [test/test_query_result.rb:628]:
--- expected
+++ actual
@@ -1 +1,3 @@
-#
+# encoding: US-ASCII
+# valid: true
+"1970-01-01"

3) Failure:
TestQueryResult#test_datetime_scalar_casting [test/test_query_result.rb:610]:
Expected: 1970-01-01 01:00:00 +0100
Actual: "1970-01-01T01:00:00+01:00"

38 runs, 120 assertions, 3 failures, 0 errors, 0 skips
rake aborted!
```

Adding the "monkey patch" above then re-fixes the tests as the casting happens automatically.

This all feels a bit gross! Is there a better way?

Thanks!

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.