Skip to content

Commit

Permalink
Generator cleanup with tests (#1717)
Browse files Browse the repository at this point in the history
* moved generator logic out of railtie

* Fix activegraph module for zeitwerk loading

* e2e tests github action

* updated script access

* add exe access on shell file

* updated action

* corrected port

* corrected activegraph ref in script

* corrected shell script

* use dynamic SHA

* corrected quotes around SHA

* debug action

* debug action

* Update setup.sh

* Update e2e_test.yml

* updated setup

* use full sha

* uncomment till model generation

* corrected sed in shell script

* using 3.2.2

* disable other tests

* corrected script to run in dev environment

* Update e2e_test.yml

* Update e2e_test.yml

* Update e2e_test.yml

* port fix

* added rails console and server test

* Update setup.sh

* Update setup.sh

* generator tests

* Update setup.sh

* bundle install in github actions

* Update model_generator_spec.rb

* add jruby tests

* downgrading jruby version

* jruby excluded against rails 7

* Update e2e_test.yml

* re enabling all normal tests

* enhance e2esetup steps

* added comment explaining jruby change

* added documentation for running e2e tests

* corrected formatting

* Update activegraph.rb

* Update e2e_test.yml

* revert unintentional change

* Update e2e_test.yml

* cleanup
  • Loading branch information
mrhardikjoshi committed Jan 25, 2024
1 parent f86d54c commit 14376c2
Show file tree
Hide file tree
Showing 12 changed files with 179 additions and 7 deletions.
47 changes: 47 additions & 0 deletions .github/workflows/e2e_test.yml
@@ -0,0 +1,47 @@
name: E2E Test

on:
push:
branches: [ '11' ]
pull_request:
branches: [ '11' ]

# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:

jobs:
e2e_test:
runs-on: ubuntu-latest
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
ruby: [ jruby-9.4.5.0, ruby-3.2.2 ]
neo4j: [ 5.15.0 ]
active_model: [ 7.1.2 ]
# jruby will fail till bug https://github.com/jruby/jruby-openssl/issues/290 is fixed
env:
ACTIVE_MODEL_VERSION: ${{ matrix.active_model }}
JRUBY_OPTS: --debug -J-Xmx1280m -Xcompile.invokedynamic=false -J-XX:+TieredCompilation -J-XX:TieredStopAtLevel=1 -J-noverify -Xcompile.mode=OFF
steps:
- name: Start neo4j
run: docker run --name neo4j --env NEO4J_AUTH=neo4j/password --env NEO4J_ACCEPT_LICENSE_AGREEMENT=yes --env NEO4J_dbms_directories_import= -p7687:7687 -p7474:7474 -v `pwd`/tmp:/var/lib/neo4j/import --rm neo4j:${{ matrix.neo4j }}-enterprise &

- uses: actions/checkout@v3

- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}

- name: Wait for neo4j
run: while [ $((curl localhost:7474/ > /dev/null 2>&1); echo $?) -ne 0 ]; do sleep 1; done

- name: Setup test rails app
run: ./e2e_tests/setup.sh

- name: Install dependencies
run: bundle update

- name: Run tests
run: bundle exec rspec -Oe2e_tests/.e2e_rspec e2e_tests/
1 change: 0 additions & 1 deletion .github/workflows/test.yml
Expand Up @@ -12,7 +12,6 @@ on:
jobs:
test:
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.ruby == 'ruby' }}
timeout-minutes: 30
strategy:
fail-fast: false
Expand Down
10 changes: 10 additions & 0 deletions docs/Testing.rst
Expand Up @@ -17,6 +17,16 @@ You can configure it to respond on a different port like so:
If you are using Rails, you can edit the test configuration ``config/environments/test.rb`` or the ``config/neo4j.yml`` file (see :doc:`Setup <Setup>`)

To run the e2e tests we first have to run setup script ``sh e2e_tests/setup.sh``. After that we can run e2e tests by ``rspec -Oe2e_tests/.e2e_rspec e2e_tests/`` command
To run the setup script with custom options we can leverage following environment variables

.. code-block:: bash
ACTIVEGRAPH_PATH=local path of activegraph code (root directory)
ACTIVE_MODEL_VERSION=version of activemodel
E2E_PORT=neo4j server port
E2E_NO_CRED=set this to true when neo4j server has auth disabled
How to clear the database
-------------------------

Expand Down
2 changes: 1 addition & 1 deletion docs/activegraph.rb
Expand Up @@ -25,7 +25,7 @@

environment generator
environment nil, env: 'development' do <<END
config.neo4j.driver.url = 'neo4j://localhost:7472'
config.neo4j.driver.url = 'neo4j://localhost:7687'
config.neo4j.driver.auth_token = Neo4j::Driver::AuthTokens.basic('neo4j', 'password')
config.neo4j.driver.encryption = false
END
Expand Down
3 changes: 3 additions & 0 deletions e2e_tests/.e2e_rspec
@@ -0,0 +1,3 @@
--color
--tty
--require ./e2e_tests/spec_helper.rb
19 changes: 19 additions & 0 deletions e2e_tests/migration_generator_spec.rb
@@ -0,0 +1,19 @@
load_migration('blah_migration.rb')

describe 'Migration Generator' do
describe 'generated migration file' do
it 'inherits from ActiveGraph::Migrations::Base' do
expect(BlahMigration).to be < ActiveGraph::Migrations::Base
end

it 'defines up method' do
migration = CreateUser.new(nil)
expect(migration.method(:up)).to be_present
end

it 'defines down method' do
migration = CreateUser.new(nil)
expect(migration.method(:up)).to be_present
end
end
end
29 changes: 29 additions & 0 deletions e2e_tests/model_generator_spec.rb
@@ -0,0 +1,29 @@
load 'myapp/app/models/user.rb'
load_migration('create_user.rb')

describe 'Model Generator' do
describe 'generated model class' do
it 'includes ActiveGraph::Node' do
expect(User < ActiveGraph::Node).to be true
end

it 'declares correct property' do
expect(User.attributes['name'].type).to be String
end
end

describe 'generated migration file' do
it 'inherits from ActiveGraph::Migrations::Base' do
expect(CreateUser).to be < ActiveGraph::Migrations::Base
end

it 'can be run/rollback without issue' do
migration = CreateUser.new(nil)
migration.down rescue nil # we make sure migration is not run before
expect do
migration.up
migration.down
end.not_to raise_error
end
end
end
47 changes: 47 additions & 0 deletions e2e_tests/setup.sh
@@ -0,0 +1,47 @@
#!/bin/sh

gem install rails -v $ACTIVE_MODEL_VERSION --no-document

if [[ -n "$ACTIVEGRAPH_PATH" ]]
then
sed 's|.*gem '"'"'activegraph'"'"'.*|gem '"'"'activegraph'"'"', path: "'"$ACTIVEGRAPH_PATH"'"|' docs/activegraph.rb > template.tmp
else
echo "SHA=$(git rev-parse "$GITHUB_SHA")" >> $GITHUB_ENV
sed 's/.*gem '"'"'activegraph'"'"'.*/gem '"'"'activegraph'"'"', github: "neo4jrb\/activegraph", ref: "'"$(git rev-parse "$GITHUB_SHA")"'"/' docs/activegraph.rb > template.tmp
fi

rails \_$ACTIVE_MODEL_VERSION\_ new myapp -O -m ./template.tmp
rm -f ./template.tmp
cd myapp

if [[ -n "$E2E_PORT" ]]
then
sed 's/7687/'$E2E_PORT'/' config/environments/development.rb > dev_env.tmp
mv dev_env.tmp config/environments/development.rb
fi

if [[ -n "$E2E_NO_CRED" ]]
then
sed "s/'neo4j'/''/" config/environments/development.rb > dev_env.tmp
mv dev_env.tmp config/environments/development.rb
sed "s/'password'/''/" config/environments/development.rb > dev_env.tmp
mv dev_env.tmp config/environments/development.rb
fi

bundle exec rails generate model User name:string
bundle exec rails generate migration BlahMigration
bundle exec rake neo4j:migrate

if echo 'puts "hi"' | bundle exec rails c
then
echo "rails console works correctly"
else
exit 1
fi

bundle exec rails s -d
until $(curl --output /dev/null --silent --head --fail localhost:3000); do
printf '.'
sleep 1
done
kill `cat tmp/pids/server.pid`
11 changes: 11 additions & 0 deletions e2e_tests/spec_helper.rb
@@ -0,0 +1,11 @@
require 'active_graph'
require 'find'

server_url = ENV['NEO4J_URL'] || 'bolt://localhost:7687'
ActiveGraph::Base.driver = Neo4j::Driver::GraphDatabase.driver(server_url, Neo4j::Driver::AuthTokens.basic('neo4j', 'password'))

def load_migration(suffix)
Find.find('myapp/db/neo4j/migrate') do |path|
load path if path =~ /.*#{suffix}$/
end
end
2 changes: 2 additions & 0 deletions lib/active_graph.rb
Expand Up @@ -26,6 +26,8 @@
loader.ignore(File.expand_path('rails', __dir__))
loader.ignore(File.expand_path('active_graph/railtie.rb', __dir__))
loader.inflector.inflect("ansi" => "ANSI")
module ActiveGraph
end
loader.setup
# loader.eager_load

Expand Down
12 changes: 7 additions & 5 deletions lib/active_graph/railtie.rb
@@ -1,11 +1,6 @@
# Need the action_dispatch railtie to have action_dispatch.rescue_responses initialized correctly
require 'action_dispatch/railtie'
require 'rails/generators'
require 'rails/generators/active_model'
require 'rails/generators/named_base'
require 'rails/railtie'
require File.expand_path('../rails/generators/migration_helper.rb', __dir__)
Rails::Generators::GeneratedAttribute.include ActiveGraph::Generators::GeneratedAttribute
require 'active_graph'

module ActiveGraph
Expand Down Expand Up @@ -44,6 +39,13 @@ def empty_config
ActiveGraph::Config[:verbose_query_logs] = false
end

# By default, Rails loads generators from load path.
# However, if we want to place generators at a different location we have to use "generators" hook
# https://api.rubyonrails.org/classes/Rails/Railtie.html
generators do
require File.expand_path('../rails/generators/migration_helper.rb', __dir__)
end

# Starting Neo after :load_config_initializers allows apps to
# register migrations in config/initializers
initializer 'neo4j.start', after: :load_config_initializers do |app|
Expand Down
3 changes: 3 additions & 0 deletions lib/rails/generators/migration_helper.rb
Expand Up @@ -101,3 +101,6 @@ def type_class
end
end
end

require 'rails/generators/named_base'
Rails::Generators::GeneratedAttribute.include ActiveGraph::Generators::GeneratedAttribute

0 comments on commit 14376c2

Please sign in to comment.